Cancella variabile in Python


Risposte:


157

Cosa c'è che non va self.left = None?


19
Non ha familiarità con la parola chiave None. È simile a null in altre lingue?
Bnicholas,

6
Sì; è equivalente a null.
Smashery,

12
@Bnicholas Tuttavia non è come nullin PHP, in quanto l'impostazione di una variabile nullin PHP ti dà un comportamento simile nella maggior parte dei casi come se non lo avessi definito in primo luogo. Un valore di Nonein Python è abbastanza diverso da una variabile non definita. Noneè abbastanza come la maggior parte delle altre incarnazioni di null, comunque (fino a quando non entriamo in dettagli più arcani, almeno).
Ben

Non è una parola chiave; è un nome predefinito per un oggetto incorporato. Puoi fare qualsiasi cosa con Noneciò che puoi fare con qualsiasi altro oggetto "semplice" di tipo non specificato: archiviarlo in contenitori, stampare una rappresentazione di stringa di esso, controllare alcuni metadati su di esso ... Comunque, hai provato Google per "python null equivalente"? Sono serio; ci vorrà un po 'di analisi, ma le informazioni sono proprio lì.
Karl Knechtel,

18
Apri il terminale Python e digita print xe premi Invio. Ciò produrrà un errore dell'interprete, come la maggior parte delle lingue quando si tenta di stampare una variabile non definita. Ma se si definisce la variabile e quindi si tenta di cancellarla con None, l'utilizzo del print xcodice produrrà la parola Nonecome output. Sono nuovo di Python, quindi potrei sbagliarmi, ma questo non sembra il comportamento di una variabile cancellata.
Musixauce3000,

408

La delparola chiave farebbe.

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

Ma in questo caso voto per self.left = None


18
a volte questo non lo rimuove del tutto, rimuove solo quel riferimento a un in memoria. Questo può lasciare in memoria variabili fantasma che non ottengono gc.
Jakob Bowyer,

4
delha anche lo svantaggio che se si tenta di eliminare una variabile che non esiste genera un'eccezione, che di solito è indesiderabile.
Philip Kearns,

33
Volevo solo sottolineare che se hai accidentalmente dichiarato una variabile che sovrascrive i comandi integrati, ad esempio, type=… quando intendevi digitare, l' type(…)eliminazione è il modo più semplice per ripristinare la funzionalità originale. Cioè, se lo tieni intorno come Nessuno, interromperai comunque l'accesso alla funzione sottostante.
mpacer,

2
Garbage Collection / Collector / Collected
mccc,

1
Questo era quello che stavo cercando. Giocando sulla linea cmd, avevo ... set = set(myList)e poi ho capito che non potevo più usare set come funzione (doh). L'utilizzo del setmi ha permesso di riutilizzarlo come fx. Ovviamente non avrei mai usato quel var riservato in uno script reale.
jbchurchill,

111

var = None "cancella il valore", impostando il valore della variabile su "null" come il valore di "Nessuno", tuttavia il puntatore alla variabile rimane.

del var rimuove totalmente la definizione per la variabile.

Nel caso in cui si desideri utilizzare la variabile in un secondo momento, ad esempio impostare un nuovo valore per essa, ovvero conservare la variabile, Nonesarebbe meglio.


E se volessi cancellare completamente la variabile che in alcune circostanze non esiste. C'è qualche parametro per evitare un errore? Ho bisogno di eliminare diverse variabili: del a, b, c, d Potrei usare loop e provare / tranne, ma preferisco qualche interruttore per evitarlo.
Tedo Vrbanec,

63

In realtà, ciò non cancella la variabile / proprietà. Tutto ciò che farà è impostare il suo valore su None, quindi la variabile occuperà ancora spazio in memoria. Se vuoi cancellare completamente tutta l'esistenza della variabile dalla memoria, puoi semplicemente digitare:

del self.left

8
Non capisco perché la risposta = None sia così popolare. Questa è la risposta corretta
Nikolay Gromov,

1
L'OP ha detto di clearno remove. del ucciderà l'attributo e le ricerche. È molto più semplice impostarlo su Nessuno, di quanto si possa verificare if self.lefte sarebbe abbastanza buono per verificare se un nodo è vuoto.
user1767754,

"È molto più semplice impostarlo su Nessuno" - vale la pena considerare che se qualcuno (te stesso qualche tempo dopo o un collaboratore) sta leggendo il codice del, IMHO, rende più ovvio che la variabile può essere dimenticata quando si analizza mentalmente ' il codice.
Tasche e

1
@NikolayGromov nel tuo codice quotidiano, quando vuoi ottenere il valore di self.left preferisci controllare if self.left:o preferisci gestire un'eventuale eccezione NameError che causerà l'arresto anomalo del programma se non lo gestisci ovunque ?
Pierre.Sassoulas,

33
  • Se vuoi eliminarlo totalmente usa del:

    del your_variable

  • O altrimenti, per rendere il valoreNone :

    your_variable = None

  • Se è un iterabile (come un elenco o una tupla), puoi renderlo vuoto come:

    your_variable.clear()

Quindi your_variablesarà vuoto


Per la seconda opzione, "cancella il suo contenuto" non è corretto, questo riassegnerà la variabile a Nessuno, l'oggetto originale rimarrà comunque (a meno che il suo conteggio di riferimento non si riduca a zero, nel qual caso viene spazzato via).
cs95,

0

Vuoi cancellare una variabile, vero?

ok, penso di avere la migliore idea alternativa alla risposta di @bnul:

Puoi eliminare singoli nomi con del:

del x oppure puoi rimuoverli dall'oggetto globals ():

for name in dir(): if not name.startswith('_'): del globals()[name]

Questo è solo un esempio di loop; elimina in modo difensivo solo i nomi che non iniziano con un carattere di sottolineatura, facendo un'ipotesi (non irragionevole) che all'inizio del tuo interprete hai usato solo nomi senza carattere di sottolineatura. È possibile utilizzare un elenco di nomi codificato da conservare invece (whitelisting) se si vuole davvero essere accurati. Non esiste una funzione integrata per eseguire la cancellazione per te, oltre a uscire e riavviare l'interprete.

I moduli che hai importato (import os) rimarranno importati perché sono indicati da sys.modules; le importazioni successive riutilizzeranno l'oggetto modulo già importato. Semplicemente non avrai un riferimento a loro nel tuo attuale spazio dei nomi globale.

Si prega di riconsiderare questa risposta!


-1

Ho usato alcune opzioni sopra menzionate:

del self.left

o impostando il valore su Nessuno usando

self.left = None

È importante conoscere le differenze e mettere in atto alcuni gestori di eccezioni quando si utilizza impostare il valore su Nessuno. Se stai stampando il valore delle istruzioni condizionali utilizzando un modello, ad esempio,

print("The value of the variable is {}".format(self.left))

potresti vedere il valore della variabile stampando "Il valore della variabile è Nessuno". Pertanto, dovresti inserire lì alcuni gestori di eccezioni:

if self.left:
    #Then only print stuff

Il comando sopra stampa i valori solo se self.left non lo è None

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.