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.left
auf leer setzen.
Antworten:
Was ist los mit
self.left = None
?quelle
null
in PHP.null
Wenn 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 vonNone
in Python unterscheidet sich erheblich von einer undefinierten Variablen.None
ist jedoch ganz wie die meisten anderen Inkarnationen vonnull
(bis wir zumindest auf arkane Details eingehen).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.print x
und 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 desprint x
Codes das WortNone
als 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.Das
del
Schlüsselwort würde reichen.Aber in diesem Fall stimme ich
self.left = None
quelle
del
hat auch den Nachteil, dass beim Versuch, eine nicht vorhandene Variable zu löschen, eine Ausnahme ausgelöst wird, die normalerweise unerwünscht ist.type=…
wenn Sie tippen wollten, dastype(…)
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.set = set(myList)
und dann wurde mir klar, dass ich set nicht mehr als Funktion (doh) verwenden konnte. Mitdel set
erlaubte konnte ich es wieder als FX verwenden. Natürlich würde ich diese reservierte Variable niemals in einem tatsächlichen Skript verwenden.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
None
dies besser.quelle
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:quelle
clear
nichtremove
. del beendet das Attribut und sucht. Es ist viel sauberer, es auf None zu setzen, als Sie überprüfen können,if self.left
und das wäre gut genug, um zu überprüfen, ob ein Knoten leer ist.del
, IMHO es offensichtlicher macht, dass die Variable beim mentalen Parsen vergessen werden kann ' der Code.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 ?Wenn Sie es vollständig löschen möchten, verwenden Sie
del
:del your_variable
Oder anders, um den Wert zu machen
None
: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_variable
wird leer seinquelle
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!
quelle
Ich habe einige der oben genannten Optionen verwendet:
oder Setzen des Werts auf Keine mit
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.
Möglicherweise wird der Wert der Variablen angezeigt. "Der Wert der Variablen ist" Keine ". Daher müssten Sie dort einige Ausnahmebehandlungsroutinen einfügen:
Der obige Befehl gibt nur Werte aus, wenn self.left dies nicht ist
None
quelle