Ich würde gerne wissen, warum ein Dateiobjekt, das mit der with () -Anweisung oder in einem Block geöffnet wurde, nach dem Beenden im Gültigkeitsbereich bleibt. Sind '& lt;' Datei geschlossen '& gt;' Objekte jemals aufgeräumt?
%Vor% In Python werden neue Bereiche (auch bekannt als Namespaces) nur für Module, Klassen und Funktionen erstellt, aber nicht für andere Anweisungen, insbesondere nicht für with
und if
Blöcke. Bezeichner, die innerhalb des Hauptteils von with
oder for
-Anweisungen gebunden sind, sind folglich im innersten umgebenden Bereich gebunden, der in Ihrem Fall der oberste Bereich des interaktiven Interpreters ist. Bezeichner sind in einem Bereich gebunden, solange dieser Gültigkeitsbereich gültig ist oder bis sie explizit aus dem Bereich entfernt werden (indem del
wie in del fal
verwendet wird).
Objekte können nur bereinigt werden, wenn sie nicht mehr referenziert werden. Der tatsächliche Moment, in dem dieses Objekt wirklich aufgeräumt wird, ist jedoch undefiniert. Python verwendet Garbage Collection für die Speicherverwaltung und erzwingt keine bestimmte Strategie. In CPython, das Referenzzählung verwendet, werden Objekte sofort bereinigt, sobald die letzte Referenz den Gültigkeitsbereich verlässt. Alternative Implementierungen wie PyPy oder Jython verwenden erweiterte Garbage Collectors, die nicht referenzierte Objekte zu beliebigen Zeitpunkten bereinigen.
Dies bedeutet, dass in Ihrem Beispiel die Objekte, die an f
und fal
gebunden sind, grundsätzlich nicht bereinigt werden, da der oberste Bereich des interaktiven Interpreters natürlich existiert, solange der Interpeter läuft. Beachten Sie jedoch, dass dies eigentlich kein Problem ist, da sie trotzdem korrekt geschlossen sind und keine Dateiressourcen mehr beanspruchen, sondern nur noch etwas Speicher.
Der Name bleibt im Gültigkeitsbereich, bis Sie den Bereich verlassen.
Wenn das Objekt bereinigt werden soll, weisen Sie dem Namen einen anderen Wert zu, z. B.
%Vor%Dies schließt die Datei nicht!
Es ist eine gute Angewohnheit, die Bereiche zu begrenzen, indem man das Programm in Funktionen (und möglicherweise Klassen) einordnet. Das macht es lesbarer und macht ungebundene Objekte (keine Namen im Bereich, die sich auf das Objekt beziehen), die für die Garbage Collection geeignet sind.
Dies ist normalerweise kein Problem, wenn Sie die Eingabeaufforderung verwenden:)
with
und if
erstellen keinen neuen Bereich, lokale Variablen werden nur innerhalb von Funktionen, Klassen und Modulen erstellt. Siehe Was ist der Umfang einer Python-Variablen? in einer if-Anweisung deklariert?
Das Dateiobjekt bleibt wie jedes andere Objekt für die Dauer Ihres Programms "hängen", bis es gelöscht wird (seine Methode __del__
wird aufgerufen).
del f
bewirkt, dass f
von Pythons Garbage Collector als Garbage-Collection erfasst wird. Dies geschieht automatisch, wenn Sie einen Bereich verlassen, Ihr Skript beendet wird oder in Ihrem Beispiel die Interpreter-Sitzung endet.