2016-05-13 7 views
2

Hier ist meine Implementierung des Knotens der verknüpften ListeNachdem ich eine verknüpfte Liste in Python implementiert habe, wie kann ich den Speicher davon befreien?

class ListNode(object): 
def __init__(self,val): 
    self.val = val 
    self.next = None 

Base auf meinem Verständnis, wie Python verwaltet den Speicher, glaube ich, wenn ich den Speicher frei brauche, ich brauche noch eine Funktion wie diese unten verwenden , nicht wahr?

def free_linked_list(head): 
    while head: 
     next_node = head.next 
     del head # As long as no variable is pointed to this node, it would be freed from the memory. Is it? 
     head = next_node 

Also mein Problem ist: 1. Ist Recht mein Verständnis? 2. Wenn nicht, wie kann ich den Speicher dieser verknüpften Liste freigeben? Oder Python hat es schon für mich getan?

+0

Wenn Sie den Hauptknoten löschen (oder den Verweis auf diesen verlieren), sollte python den Rest der verknüpften Liste freigeben. – mgilson

Antwort

0

Sie haben Recht, dass Python die Garbage Collection anstelle der manuellen Speicherverwaltung verwendet, wie Sie es in C oder anderen Low-Level-Sprachen haben. Dies bedeutet, dass die Python-Laufzeitumgebung einen Hintergrundthread verwendet, der "verwaiste" Objekte, die von keinem anderen Objekt in Ihrem Programm referenziert werden, regelmäßig markiert und entfernt.

In der Tat ist Ihr Beispiel ein bisschen komplizierter als es sein muss. Solange es keinen Verweis auf den Kopf der Liste gibt, ist die gesamte Liste "gestrandet" und wird von der Python-Laufzeit gesammelt.

+0

Aber diese verknüpfte Liste Knoten ist in meiner Perspektive relativ anders. Obwohl ich den Verweis auf den Hauptknoten gelöscht habe, aber dieser Hauptknoten immer noch eine Referenz zu seinem nächsten Knoten haben. Und was ist mit dem Wert des Kopfknotens und seinem Zeiger zum nächsten Knoten? Wie weiß Python also, dass der Kopfknoten entsorgt werden sollte? –

+0

Was meinst du? In welcher Hinsicht anders? –

+0

Oh! Ich verstehe jetzt! Die Knoten in der Liste würden alle ihre Referenz verlieren, wenn die Referenz auf den Kopf entfernt würde. –

0

Ja, Ihr Verständnis ist richtig. Solange das Objekt nicht mehr referenziert wird, kümmert sich Pythons Garbage Collection darum. Sie können auch explizit gc.collect() aufrufen, um die Garbage Collection zu erzwingen, wenn Sie dies auch wirklich benötigen. Hier ein Link zur Dokumentation: https://docs.python.org/2/library/gc.html

Verwandte Themen