Ich erstelle ein Tupel und konvertiere es dann in eine Liste mit dem Code:
%Vor%Markiert Python die Objekte einfach als veränderbar und erreichbar über das Label y, oder erstellt es eine vollständige Kopie jedes Objekts, fügt diese zur neuen Listenstruktur hinzu und löscht dann die ursprünglichen unveränderlichen Objekte?
Prost
Während der Ausführung der Zeile
%Vor%Folgendes passiert:
Die rechte Seite wird ausgewertet. Dies beinhaltet das Erstellen eines neuen Listenobjekts. Das Listenobjekt wird mit den Elementen des Tuple-Objekts gefüllt, das an den Konstruktor übergeben wird. Diese Elemente werden nicht kopiert. Stattdessen wird die Anzahl ihrer Referenzen erhöht, und Verweise auf diese Elemente werden dem neuen Listenobjekt hinzugefügt.
Das neu erstellte Listenobjekt wird dem Namen auf der linken Seite zugewiesen ( y
). Dazu gehört zunächst das Aufheben der Zuweisung des Namens, wodurch der Referenzzähler des zuvor angegebenen Tupel-Objekts y
verringert wird. Da zu diesem Tupelobjekt keine Referenzen mehr vorhanden sind, wird es gelöscht. Schließlich wird y
auf das neue Listenobjekt zeigen.
Sie können herausfinden, indem Sie die id
jedes Objekts überprüfen.
Hier sind die Ergebnisse meines Laufs.
%Vor%Wie Sie sehen können, sind die Objekte gleich.
Update: Sven Marnach erklärt wie und warum perfekt. Nur als Referenz, ich habe mehr Tests für andere Arten von Objekten durchgeführt.
Für ein Objekt
%Vor%Für eine Liste
%Vor%Für eine Liste von Listen
%Vor%Python macht kein tiefgreifendes Kopieren, es sei denn, Sie fragen es ausdrücklich danach. Das Ergebnis wird also eine neue, änderbare Liste sein, die Verweise auf exakt die gleichen Objekte enthält, die Sie in das Tupel gesetzt haben.
Beachten Sie, dass die Objekte im Tupel selbst immer veränderbar waren. Es ist nur das Tupel von Strings, das unveränderlich ist, d. H. Sie können dem Tupel keine Objekte hinzufügen / entfernen, aber Sie können immer auf Objekte innerhalb eines Tupels zugreifen und sie ändern .
Tags und Links python