2016-12-02 7 views
1

Ich habe eine doppelt verkettete Liste erstellt. Meine Liste enthält nur 2 Elemente (angenommen node1 und node2) und ich möchte den head Zeiger, der auf den ersten Knoten (node1) in der Liste verweist, löschen. Da in Cpython der primäre Algorithmus für die Speicherbereinigung die Referenzzählung ist.doppelt verknüpfte Liste - Garbage Collection

Jetzt ist meine Frage - (Beispiel 1), wenn ich die self.head-self.head = self.head.next gesetzt und stellen node2prev (iV) Attribut None - das aus dem Speicher des ersten Knotens komplett löscht? Denn die node1 hat jetzt keine weiteren Referenzen. Oder muss del Methode wie im zweiten Beispiel gezeigt (Beispiel-2)? Welches ist der richtige Weg, um die node1 komplett aus dem Speicher zu löschen?

Beispiel 1:

def remHead(self): 
    temp=self.head.next 
    self.head=self.head.next 
    temp.prev=None 

Beispiel 2:

def remHead(self): 
    temp=self.head.next 
    del self.head 
    self.head=temp 
    self.head.prev=None 

Antwort

2

von del self.head Sie den Verweis auf den Knoten löschen, nicht der Knoten selbst. Durch Neuzuweisung geht der Bezug zum Knoten verloren. Normalerweise gibt es in beiden Fällen nichts, was auf den nächsten Knoten zeigt. Im Allgemeinen löscht Python etwas aus dem Speicher, sobald es keine Referenzen darauf gibt. Also, in Ihrem Fall haben beide das gleiche Ergebnis. Ich würde lieber nur neu zuweisen, ohne zu löschen

PS: Natürlich vorausgesetzt, dass die Referenzen nicht irgendwo anders in Ihrem Code

gehalten werden