web-dev-qa-db-de.com

Gibt es eine Möglichkeit, erstellte Variablen, Funktionen usw. aus dem Speicher des Interpreters zu löschen?

Ich habe seit ein paar Tagen nach der richtigen Antwort auf diese Frage gesucht, aber nichts Gutes gefunden. Ich bin kein absoluter Programmieranfänger, aber noch nicht einmal auf der Mittelstufe.

Wenn ich in der Shell von Python bin, gebe ich ein: dir() und ich kann alle Namen aller Objekte im aktuellen Bereich (Hauptblock) sehen, es gibt 6 davon:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']

Wenn ich dann eine Variable deklariere, zum Beispiel x = 10, Wird diese automatisch zu den Objektlisten unter dem eingebauten Modul dir() hinzugefügt, und wenn ich erneut dir() eingebe Es zeigt jetzt:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']

Gleiches gilt für Funktionen, Klassen und so weiter.

Wie lösche ich alle neuen Objekte, ohne den Standard 6 zu löschen, der zu Beginn verfügbar war?

Ich habe hier über "Speicherbereinigung", "Bereinigung der Konsole" gelesen, bei der der gesamte Text aus dem Eingabeaufforderungsfenster gelöscht wird:

>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()

Aber das alles hat nichts mit dem zu tun, was ich erreichen will, es räumt nicht alle benutzten Objekte aus.

88
funghorn

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

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 werden nur Namen defensiv gelöscht, die nicht mit einem Unterstrich beginnen. Dabei wird (nicht unbegründet) davon ausgegangen, dass Sie in Ihrem Interpreter nur Namen ohne Unterstrich am Anfang verwendet haben. Sie könnten stattdessen eine fest codierte Liste von Namen verwenden (Whitelisting), wenn Sie wirklich gründlich sein möchten. Es gibt keine eingebaute Funktion, um das Löschen für Sie durchzuführen, außer den Interpreter zu beenden und neu zu starten.

Von Ihnen importierte Module (import os) Werden weiterhin importiert, da sie von sys.modules Referenziert werden. Bei nachfolgenden Importen wird das bereits importierte Modulobjekt wiederverwendet. Sie haben in Ihrem aktuellen globalen Namespace einfach keinen Verweis darauf.

112
Martijn Pieters

Ja. Es gibt eine einfache Möglichkeit, alles in iPython zu entfernen. Geben Sie in der iPython-Konsole Folgendes ein:

%reset

Das System fordert Sie dann zur Bestätigung auf. Drücken Sie y. Wenn Sie diese Eingabeaufforderung nicht sehen möchten, geben Sie einfach Folgendes ein:

%reset -f

Das sollte funktionieren..

50
EyesBear

Wenn Sie sich in einer interaktiven Umgebung wie Jupyter oder ipython befinden, könnte es Sie interessieren, unerwünschte var's zu löschen wenn sie schwer werden.

Die magischen Befehle reset und reset_selective ist in interaktiven python Sitzungen wie ipython und Jupyter verfügbar

1) reset

reset Setzt den Namespace zurück, indem alle vom Benutzer definierten Namen entfernt werden, wenn sie ohne Argumente aufgerufen werden.

in und die Parameter out geben an, ob Sie die In-/Out-Caches leeren möchten. Der Verzeichnisverlauf wird mit dem Parameter dhist gelöscht.

reset in out

Ein weiteres interessantes ist array, das nur numpy Arrays entfernt:

reset array

2) reset_selective

Setzt den Namespace zurück, indem vom Benutzer definierte Namen entfernt werden. Der Eingabe-/Ausgabeverlauf bleibt für den Fall erhalten, dass Sie ihn benötigen.

Beispiel für ein sauberes Array:

In [1]: import numpy as np
In [2]: littleArray = np.array([1,2,3,4,5])
In [3]: who_ls
Out[3]: ['littleArray', 'np']
In [4]: reset_selective -f littleArray
In [5]: who_ls
Out[5]: ['np']

Quelle: http://ipython.readthedocs.io/en/stable/interactive/magics.html

8
user1767754

Sie können python Garbage Collector verwenden:

import gc
gc.collect()
8
Fardin

Das hat bei mir funktioniert.

Sie müssen es zweimal für Globals ausführen, gefolgt von Locals

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

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

Tatsächlich wird python den nicht mehr verwendeten Speicher freigeben. Dies wird Garbage Collection genannt, was ein automatischer Vorgang in Python ist. Aber trotzdem, wenn Sie es dann tun möchten Sie können es mit del variable_name löschen oder indem Sie die Variable None zuweisen.

a = 10
print a 

del a       
print a      ## throws an error here because it's been deleted already.

Die einzige Möglichkeit, Speicher von nicht referenzierten Python - Objekten zurückzugewinnen, ist der Garbage Collector. Das del-Schlüsselwort hebt einfach die Bindung eines Namens von einem Objekt auf, das Objekt muss jedoch noch Garbage Collector sein. Sie können dies erzwingen Die Ausführung des Garbage Collectors mit dem Modul gc stellt mit ziemlicher Sicherheit eine vorzeitige Optimierung dar. Die Verwendung von del hat keine wirkliche Auswirkung, da diese Namen gelöscht worden wären, da sie ohnehin aus dem Geltungsbereich geraten wären .

3
d-coder