Ich suche nach etwas ähnlichem wie 'clear' in Matlab: Ein Befehl / eine Funktion, die alle Variablen aus dem Arbeitsbereich entfernt und sie aus dem Systemspeicher freigibt. Gibt es so etwas in Python?
EDIT: Ich möchte ein Skript schreiben, das irgendwann alle Variablen löscht.
del
diese nach Abschluss ausführen. Wenn Sie sich nur Sorgen machen, dass der Namespace überfüllt ist, sollten Sie Ihr Design wahrscheinlich mit so vielen Namen überdenken. Beispielsweise ist es für eine Reihe von Bildtransformationen wahrscheinlich nicht erforderlich, jeden Zwischenschritt beizubehalten.Antworten:
Die folgende Befehlsfolge entfernt jeden Namen aus dem aktuellen Modul:
>>> import sys >>> sys.modules[__name__].__dict__.clear()
Ich bezweifle, dass Sie dies tatsächlich tun möchten, da "jeder Name" alle integrierten Funktionen enthält, sodass Sie nach einem solchen vollständigen Auslöschen nicht viel tun können. Denken Sie daran, dass es in Python wirklich keine "Variable" gibt - es gibt Objekte verschiedener Art (einschließlich Module, Funktionen, Klassen, Zahlen, Zeichenfolgen, ...) und Namen , die an Objekte gebunden sind. Die Sequenz entfernt jeden Namen aus einem Modul (die entsprechenden Objekte verschwinden genau dann, wenn jeder Verweis auf sie gerade entfernt wurde).
Vielleicht möchten Sie selektiver sein, aber es ist schwer zu erraten, was Sie genau meinen, es sei denn, Sie möchten spezifischer sein. Aber nur um ein Beispiel zu geben:
>>> import sys >>> this = sys.modules[__name__] >>> for n in dir(): ... if n[0]!='_': delattr(this, n) ... >>>
Diese Sequenz hinterlässt private oder magische Namen, einschließlich des
__builtins__
speziellen Namens, der alle integrierten Namen enthält. Einbauten funktionieren also immer noch - zum Beispiel:>>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'n'] >>>
Wie Sie sehen, bleibt auch
n
der Name (die darin enthaltene Steuervariablefor
) bestehen (da erfor
jedes Mal in der Klausel neu gebunden wird ). Daher ist es möglicherweise besser, diese Steuervariable zu benennen_
, um beispielsweise deutlich zu zeigen, dass sie vorhanden ist special "(plus, im interaktiven Interpreter wird der Name_
ohnehin nach jedem vollständigen Ausdruck, der an der Eingabeaufforderung eingegeben wird, auf den Wert dieses Ausdrucks neu gebunden, damit er nicht lange anhält ;-).Wie auch immer, wenn Sie genau bestimmt haben , was es ist etwas Sie tun wollen, ist es nicht schwer , eine Funktion für den Zweck zu definieren und sie in Ihrer Start-up - Datei (wenn Sie es in interaktiven Sitzungen nur wollen) oder Website-fertige Datei ( wenn Sie es in jedem Skript wollen).
quelle
int = (2).__class__
,str = ''.__class__
,True = (1 == 1)
etc ...for n in dir(): ... if n[0]!='_': delattr(this, n)
irgendwann verwendenn=this
und es in der Schleife löschen! Bei der nächsten Iteration tritt also ein Fehler beim Versuch auf,delattr(this,n)
weil Sie ihn gerade gelöscht haben! :) Also funktioniert es nicht richtigNein, am besten starten Sie den Interpreter neu
IPython ist ein hervorragender Ersatz für den mitgelieferten Interpreter und verfügt über den
%reset
Befehl, der normalerweise funktioniertquelle
ctrl-d
dannpyt
->tab
in den Interpreter zurück zu bekommen. Kein Grund, hier etwas Besonderes zu tun.%reset -f
diese Option , um nicht interaktiv zu sein. stackoverflow.com/questions/38798181/…Wenn Sie eine Funktion schreiben, verschwinden alle Namen, sobald Sie sie belassen.
Das Konzept heißt Namespace und ist so gut, dass es in das Zen von Python gelangt ist :
Der Namespace von IPython kann ebenfalls mit dem Befehl magic zurückgesetzt werden
%reset -f
. (Das-f
bedeutet "Kraft"; mit anderen Worten: "Frag mich nicht, ob ich wirklich alle Variablen löschen möchte, mach es einfach.")quelle
from IPython import get_ipython; get_ipython().magic('reset -sf')
quelle
%reset -sf
Dies ist eine modifizierte Version von Alex 'Antwort. Wir können den Status des Namespace eines Moduls speichern und mithilfe der folgenden 2 Methoden wiederherstellen ...
__saved_context__ = {} def saveContext(): import sys __saved_context__.update(sys.modules[__name__].__dict__) def restoreContext(): import sys names = sys.modules[__name__].__dict__.keys() for n in names: if n not in __saved_context__: del sys.modules[__name__].__dict__[n] saveContext() hello = 'hi there' print hello # prints "hi there" on stdout restoreContext() print hello # throws an exception
Sie können auch eine Zeile "clear = restoreContext" hinzufügen, bevor Sie saveContext () aufrufen, und clear () funktioniert wie matlab's clear.
quelle
names = list(sys.modules[__name__].__dict__.keys())
, andernfalls beschwert sich Python, dass Sie die Wörterbuchgröße geändert haben, während Sie dasdict_keys
Objekt durchlaufen .import
diese Antwort antworten möchten (dh ich habe diese gespeichert und importiere sie aus einem Jupyter-Notizbuch, um den Namespace zwischen verschiedenen Problemen in einer Hausaufgabe zu löschen), denke ich, dass Sie"__main__"
stattdessen verwenden möchten__name__
.In Spyder kann die IPython-Konsole für jede Python-Datei so konfiguriert werden, dass alle Variablen vor jeder Ausführung im Menü gelöscht werden
Run -> Configuration -> General settings -> Remove all variables before execution
.quelle
Die
globals()
Funktion gibt ein Wörterbuch zurück, in dem Schlüssel Namen von Objekten sind, die Sie benennen können (und Werte sind übrigensid
s dieser Objekte). Dieexec()
Funktion nimmt eine Zeichenfolge und führt sie so aus, als ob Sie sie nur in eine Python-Konsole eingeben. Der Code ist alsofor i in list(globals().keys()): if(i[0] != '_'): exec('del {}'.format(i))
quelle
In der IDE im Leerlauf befindet sich Shell / Restart Shell. Cntrl-F6 wird es tun.
quelle
Ist es nicht der einfachste Weg, eine Klasse zu erstellen, die alle benötigten Variablen enthält? Dann haben Sie ein Objekt mit allen aktuellen Variablen, und wenn Sie möchten, können Sie diese Variable überschreiben?
quelle