Python 'mit' kein Objekt löschen

8

Versuchen Sie, ein Python-Objekt ordnungsgemäß zu löschen. Ich erstelle ein Objekt und lösche es dann angeblich mit einer 'with'-Anweisung. Aber wenn ich einen Ausdruck mache, nachdem die With-Anweisung geschlossen wurde .... das Objekt ist immer noch da:

%Vor%

gibt zurück:

%Vor%     
rikkitikkitumbo 15.03.2016, 04:28
quelle

4 Antworten

17

In Pythons with Anweisung geht es nicht um das Löschen von Objekten - es geht um Ressourcenverwaltung. Mit den Methoden __enter__ und __exit__ können Sie Ressourceninitialisierungs- und -zerstörungscode angeben, d. H., Sie können dort etwas löschen, aber Objekte werden nicht implizit gelöscht. Lesen Sie diesen Artikel with , um besser zu verstehen, wie Sie ihn verwenden können.

Das Objekt bleibt nach der with -Anweisung im Gültigkeitsbereich. Sie könnten del aufrufen, wenn Sie das möchten. Da es im Bereich ist, können Sie es abfragen, nachdem die zugrunde liegenden Ressourcen geschlossen wurden. Betrachten Sie diesen Pseudo-Code:

%Vor%

Wir möchten nicht, dass eine Datenbankverbindung länger läuft als wir brauchen (ein anderer Thread / Client könnte sie brauchen), stattdessen erlauben wir die Freigabe der Ressource (implizit am Ende des Blocks with ) , aber dann können wir weiterhin das Objekt abfragen. Ich habe dann eine explizite del hinzugefügt, um der Laufzeit mitzuteilen, dass der Code mit der Variablen beendet ist.

    
Alex Taylor 15.03.2016 04:35
quelle
5

with ruft die Methode __exit__ eines Objekts beim Verlassen des Bereichs des Blocks auf. Was Ihre __exit__ Methode macht, ist nur object_deleted zu drucken. Sie müssen den Code zum Zerstören des Objekts tatsächlich in Ihre __exit__ Methode einfügen (aber beachten Sie, das ist keine gute Übung!).

Was passiert ist:

%Vor%

Wenn Sie das Objekt explizit löschen möchten, sollten Sie es Pythons Garbage Collector überlassen. Lesen Sie diese Frage , es wird Ihnen helfen. Sie können versuchen, gc.collect() oder die Methode __del__ zu überschreiben. Hier ist eine weitere gute Diskussion .

    
Chuck Logan Lim 15.03.2016 04:34
quelle
2
  

Versuchen Sie, ein Python-Objekt ordnungsgemäß zu löschen

Dies ist Ihr erster Fehler, interpretierte Sprachen befreien Sie ausdrücklich davon, sich um das Löschen von Objekten zu kümmern, um Speicher freizugeben. Sie löschen sie, wenn keine Referenzen mehr vorhanden sind und das Objekt nicht mehr im Bereich ist.

Zweitens:

%Vor%

Bei Verwendung von with trotz Einrückens doesn 't einen neuen Bereich erstellen .

Vergleichen Sie Ihren Code mit:

%Vor%

Was gibt:

%Vor%

Hier ist das interne stuff in% do_it() nicht mehr vorhanden. Wenn also das zweite print(stuff) ausgeführt wird, gibt es "no stuff" .

Letztendlich müssen Sie sich keine Gedanken über das Löschen von Objekten machen. Es wird passieren, und es ist nicht Ihre Aufgabe, es zu verwalten.

    
user764357 15.03.2016 04:50
quelle
1

Also, vielen Dank für die guten Links. Aber ich wollte wirklich ein Objekt löschen und nicht auf den ausgefallenen Müllsammler warten. Das hat funktioniert:

%Vor%

gibt jetzt zurück:

%Vor%

Hurra! Es ist gelöscht

    
rikkitikkitumbo 15.03.2016 05:03
quelle

Tags und Links