Variable in Python löschen

207

Gibt es eine Möglichkeit, den Wert einer Variablen in Python zu löschen?

Zum Beispiel, wenn ich einen Binärbaum implementiert habe:

Class Node:
    self.left = somenode1
    self.right = somenode2

Wenn ich einen Knoten aus dem Baum entfernen wollte, musste ich ihn self.leftauf leer setzen.

Bnicholas
quelle

Antworten:

157

Was ist los mit self.left = None?

bnaul
quelle
19
Nicht vertraut mit dem Schlüsselwort None. Ist dies in anderen Sprachen ähnlich wie null?
Bnicholas
6
Ja; es ist gleich Null.
Smashery
12
@Bnicholas Es ist jedoch nicht wie nullin PHP. nullWenn Sie eine Variable auf PHP setzen, verhalten Sie sich in den meisten Fällen ähnlich, als hätten Sie sie überhaupt nicht definiert. Ein Wert von Nonein Python unterscheidet sich erheblich von einer undefinierten Variablen. Noneist jedoch ganz wie die meisten anderen Inkarnationen von null(bis wir zumindest auf arkane Details eingehen).
Ben
Es ist kein Schlüsselwort; Dies ist ein standardmäßig festgelegter Name für ein integriertes Objekt. Sie können alles damit machen None, was Sie mit jedem anderen "einfachen" Objekt eines nicht spezifizierten Typs tun können: Speichern Sie es in Containern, drucken Sie eine Zeichenfolgendarstellung davon, überprüfen Sie einige Metadaten darauf ... Wie auch immer, haben Sie Google auf "Python null" ausprobiert Äquivalent "? Es ist mein ernst; Es wird ein bisschen Analyse erfordern, aber die Informationen sind genau dort.
Karl Knechtel
18
Öffnen Sie das Python-Terminal, geben Sie ein print xund drücken Sie die Eingabetaste. Dies führt wie die meisten Sprachen zu einem Interpreterfehler, wenn Sie versuchen, eine undefinierte Variable zu drucken. Wenn Sie die Variable jedoch definieren und dann versuchen, sie mit None zu löschen, wird bei Verwendung des print xCodes das Wort Noneals Ausgabe erzeugt. Ich bin neu in Python, daher könnte ich mich irren, aber dies scheint nicht das Verhalten einer gelöschten Variablen zu sein.
Musixauce3000
407

Das delSchlüsselwort würde reichen.

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

Aber in diesem Fall stimme ich self.left = None

starify
quelle
18
Manchmal wird dies nicht vollständig entfernt. Dadurch wird nur der Verweis auf einen im Speicher entfernt. Dies kann Ghost-Variablen im Speicher belassen, die nicht gc erhalten.
Jakob Bowyer
4
delhat auch den Nachteil, dass beim Versuch, eine nicht vorhandene Variable zu löschen, eine Ausnahme ausgelöst wird, die normalerweise unerwünscht ist.
Philip Kearns
33
Ich wollte nur darauf hinweisen, dass, wenn Sie versehentlich eine Variable deklariert haben, die eingebaute Befehle überschreibt, z. B. type=… wenn Sie tippen wollten, das type(…)Löschen der einfachste Weg ist, die ursprüngliche Funktionalität wiederherzustellen. Das heißt, wenn Sie es als Keine beibehalten, wird der Zugriff auf die zugrunde liegende Funktion weiterhin gesperrt.
mpacer
1
Müllabfuhr
1
Dies war der, den ich gesucht habe. Als ich an der cmd-Linie spielte, hatte ich ... set = set(myList)und dann wurde mir klar, dass ich set nicht mehr als Funktion (doh) verwenden konnte. Mit del seterlaubte konnte ich es wieder als FX verwenden. Natürlich würde ich diese reservierte Variable niemals in einem tatsächlichen Skript verwenden.
jbchurchill
111

var = None "löscht den Wert" und setzt den Wert der Variablen wie den Wert "Keine" auf "null", der Zeiger auf die Variable bleibt jedoch erhalten.

del var Entfernt die Definition für die Variable vollständig.

Wenn Sie die Variable später verwenden möchten, z. B. einen neuen Wert dafür festlegen, dh die Variable beibehalten, ist Nonedies besser.

user11788
quelle
Was ist, wenn ich eine Variable, die unter bestimmten Umständen nicht vorhanden ist, vollständig löschen möchte? Gibt es einen Parameter, um einen Fehler zu vermeiden? Ich muss mehrere Variablen löschen: del a, b, c, d Ich könnte loop und try / exception verwenden, aber ich bevorzuge einen Schalter, um dies zu vermeiden.
Tedo Vrbanec
63

Tatsächlich wird dadurch die Variable / Eigenschaft nicht gelöscht. Alles, was es tun wird, ist seinen Wert auf zu setzen None, daher nimmt die Variable immer noch Speicherplatz im Speicher ein. Wenn Sie die gesamte Existenz der Variablen vollständig aus dem Speicher löschen möchten, können Sie einfach Folgendes eingeben:

del self.left
Viraj Shah
quelle
8
Ich verstehe nicht, warum die Antwort = Keine so beliebt ist. Dies ist die richtige Antwort
Nikolay Gromov
1
Das OP sagte clearnicht remove. del beendet das Attribut und sucht. Es ist viel sauberer, es auf None zu setzen, als Sie überprüfen können, if self.leftund das wäre gut genug, um zu überprüfen, ob ein Knoten leer ist.
user1767754
"Es ist viel sauberer, es auf" Keine "zu setzen - es ist zu bedenken, dass, wenn jemand (Sie selbst einige Zeit später oder ein Mitarbeiter) den Code liest del, IMHO es offensichtlicher macht, dass die Variable beim mentalen Parsen vergessen werden kann ' der Code.
Taschen und
1
@NikolayGromov in Ihrem täglichen Code, wenn Sie den Wert von self.left erhalten möchten, überprüfen Sie lieber if self.left:, oder möchten Sie lieber eine mögliche NameError-Ausnahme behandeln, die Ihr Programm zum Absturz bringt, wenn Sie nicht überall damit umgehen ?
Pierre.Sassoulas
33
  • Wenn Sie es vollständig löschen möchten, verwenden Sie del:

    del your_variable

  • Oder anders, um den Wert zu machenNone :

    your_variable = None

  • Wenn es sich um eine iterable Datei handelt (z. B. eine Liste oder ein Tupel), können Sie sie wie folgt leer machen:

    your_variable.clear()

Dann your_variablewird leer sein

U10-Vorwärts
quelle
Bei der zweiten Option ist "Inhalt löschen" nicht korrekt. Dadurch wird die Variable nur "Keine" neu zugewiesen. Das ursprüngliche Objekt bleibt weiterhin erhalten (es sei denn, die Referenzanzahl wird auf Null reduziert. In diesem Fall wird der Speicherplatz gesammelt).
CS95
0

Möchten Sie eine Variable löschen, nicht wahr?

ok, ich denke ich habe eine beste alternative idee zu @bnul antwort:

Sie können einzelne Namen löschen mit del:

del x oder Sie können sie aus dem Objekt globals () entfernen:

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

Dies ist nur eine Beispielschleife. Es löscht defensiv nur Namen, die nicht mit einem Unterstrich beginnen, und geht davon aus, dass Sie zu Beginn in Ihrem Interpreter nur Namen ohne Unterstrich verwendet haben. Sie können stattdessen eine fest codierte Liste von Namen verwenden (Whitelist), wenn Sie wirklich gründlich sein möchten. Es gibt keine eingebaute Funktion, um das Löschen für Sie durchzuführen, außer nur den Interpreter zu beenden und neu zu starten.

Von Ihnen importierte Module (Import-Betriebssysteme) bleiben importiert, da sie von sys.modules referenziert werden. Nachfolgende Importe verwenden das bereits importierte Modulobjekt wieder. Sie haben in Ihrem aktuellen globalen Namespace einfach keinen Verweis darauf.

Bitte überdenken Sie diese Antwort!

Federico Migueletto
quelle
-1

Ich habe einige der oben genannten Optionen verwendet:

del self.left

oder Setzen des Werts auf Keine mit

self.left = None

Es ist wichtig, die Unterschiede zu kennen und einige Ausnahmebehandlungsroutinen einzurichten, wenn Sie den Wert auf Keine setzen. Wenn Sie den Wert der bedingten Anweisungen mithilfe einer Vorlage drucken, z.

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

Möglicherweise wird der Wert der Variablen angezeigt. "Der Wert der Variablen ist" Keine ". Daher müssten Sie dort einige Ausnahmebehandlungsroutinen einfügen:

if self.left:
    #Then only print stuff

Der obige Befehl gibt nur Werte aus, wenn self.left dies nicht ist None

Navneet Kumar
quelle