Warum hängt der Kontext nach einer With-Anweisung?

7

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%     
pyInTheSky 16.02.2011, 20:05
quelle

5 Antworten

14

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.

    
lunaryorn 16.02.2011, 20:18
quelle
4

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:)

    
extraneon 16.02.2011 20:12
quelle
1

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?

    
geoffspear 16.02.2011 20:13
quelle
0

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.

    
Aphex 16.02.2011 20:10
quelle
0

Pythons with Anweisung ruft die __exit__ -Methode der Dateiklasse auf [die im Fall von Dateien diese schließt]. Es löscht das Objekt nicht; Es wird nur bereinigt, wenn Sie es explizit bereinigen oder das Programm / den Interpreter schließen.

    
Foo Bah 16.02.2011 20:12
quelle

Tags und Links