Wann löscht Python Variablen?

8

Ich weiß, dass Python einen automatischen Garbage Collector hat und daher sollte es automatisch Variablen löschen, wenn es keinen Verweis mehr auf sie gibt.

Mein Eindruck ist, dass dies bei lokalen Variablen (innerhalb einer Funktion) nicht geschieht.

%Vor%

ist der richtige Weg, um Speicher zu sparen?

%Vor%

BEARBEITEN: Ich habe mein Beispiel so bearbeitet, dass es meinem wirklichen Problem ähnlicher ist. In meinem realen Problem sind x und y keine Liste, sondern Klasse, die verschiedene lange np.array

enthält

BEARBEITEN: Ich kann den Code ausführen:

%Vor%     
Donbeo 13.08.2014, 12:28
quelle

4 Antworten

6

Implementierungen verwenden die Referenzzählung, um zu bestimmen, wann eine Variable gelöscht werden soll.

Nachdem die Variable den Gültigkeitsbereich verlassen hat (wie in Ihrem Beispiel), wenn keine weiteren Referenzen darauf vorhanden sind, wird der Speicher freigegeben.

%Vor%

Abgesehen von Dictionary-Schlüsseln und Elementen in Listen gibt es normalerweise wenig Grund, Variablen in Python manuell zu löschen.

Wie in den Antworten auf diese Frage angegeben wurde, wurde del kann nützlich sein, um Absicht zu zeigen.

    
Caw 13.08.2014, 12:31
quelle
3

Es ist wichtig, zwei Konzepte getrennt zu halten: Namen und Werte. Eine Variable in Python ist ein Name, der sich auf einen Wert bezieht. Namen haben Geltungsbereich: Wenn Sie eine lokale Variable definieren (indem Sie einem Namen einen Wert zuweisen), ist der Gültigkeitsbereich der Variablen die aktuelle Funktion. Wenn die Funktion zurückkehrt, verschwindet die Variable. Aber das bedeutet nicht, dass der Wert weggeht.

Werte haben keinen Spielraum: sie bleiben so lange bestehen, bis sich keine Namen mehr auf sie beziehen. Sie können einen Wert in einer Funktion erstellen und ihn von dieser Funktion zurückgeben. Ein Name außerhalb der Funktion bezieht sich auf den Wert, und der Wert wird erst wieder freigegeben, wenn ein bestimmter zukünftiger Punkt wegfällt.

Weitere Details (einschließlich Bilder!) finden Sie hier: Fakten und Mythen über Python-Namen und -Werte .

    
Ned Batchelder 13.08.2014 12:52
quelle
0

Schreiben Sie Dinge, die Sie aus dem Speicher in separaten Funktionen löschen möchten. In Ihrem Beispiel können Sie

tun %Vor%

Dies wird eine Ausnahme verursachen

    
user1023380 13.08.2014 12:40
quelle
0

Das hängt von der Implementierung und dem Typ der Variablen ab. Für einfache Objekte wie Ints gibt es einige Optimierungen. In CPython beispielsweise wird ein einfacher Int den gleichen Speicher wiederverwenden, selbst nachdem del verwendet wurde. Sie können sich nicht darauf verlassen, aber es zeigt, dass die Dinge komplexer sind, als sie erscheinen.

Denken Sie daran, dass Sie mit del einen Namen löschen, nicht unbedingt ein Objekt.
Zum Beispiel:

%Vor%

Wäre genauer gesagt:

%Vor%

del dekrementiert die Referenzzählung für dieses Objekt, aber selbst wenn es auf Null fällt, ist es nicht garantiert, dass es in absehbarer Zeit zu einer Garbage Collection kommt.

Schlagen Sie vor, sich das Modul % pc_de% für eine Erläuterung und Inspiration anzuschauen. Dann denke nochmal nach.

Wenn Sie nicht genügend Speicher haben, haben Sie wahrscheinlich ein grundlegendes Problem mit Ihrem Design. Höchstwahrscheinlich laden Sie zu viele Daten auf einmal (versuchen Sie es mit Iteratoren?), Oder vielleicht muss Ihr Code besser strukturiert werden.

Ich habe gerade deine Bearbeitung gesehen. Benötigen Sie das gesamte Array zur gleichen Zeit im Speicher? Könnten Sie einen Generator verwenden?

Eine andere Alternative ist die Verwendung einer Datenbank wie SQLite oder eines Regals

    
cdarke 13.08.2014 12:48
quelle