python wann copy.copy verwendet werden soll

7

Ich glaube, ich beginne Python zu verstehen, aber ich habe immer noch Probleme mit einer grundlegenden Frage. Wann muss copy.copy verwendet werden?

%Vor%

Ok macht Sinn. Aber unter welchen Umständen bildet das Sprechen von b=a eine Art "Verbindung" zwischen a und b, so dass das Modifizieren von a dann b modifizieren würde? Das ist, was ich nicht über copy.copy - jedes Mal, wenn Sie eine Variable zu einem anderen mit dem Gleichheitszeichen zuweisen kopieren einfach den Wert?

    
captainandcoke 12.08.2011, 22:26
quelle

2 Antworten

22

Grundsätzlich b = a points b auf wo auch immer a Punkte und nichts anderes.

Was Sie fragen, ist veränderbare Typen. Zahlen, Strings, Tupel, frozensets, booleans, None sind unveränderlich. Listen, Wörterbücher, Sets, Bytearrays sind veränderbar.

Wenn ich einen veränderlichen Typ wie list :

mache %Vor%

Sie werden beide immer noch auf den gleichen Gegenstand zeigen.

Ich werde auch deinen ursprünglichen Code kommentieren:

%Vor%

Sie können jederzeit sehen, wohin etwas im Speicher zeigt, indem Sie id(something) ausführen.

%Vor%

Sie verwenden copy , wenn Sie eine Kopie einer Struktur erstellen möchten. Es macht jedoch immer noch keine Kopie von etwas, das interniert . Dies beinhaltet ganze Zahlen kleiner als 256 , True , False , None , kurze Strings wie a . Grundsätzlich sollten Sie niemals verwenden , wenn Sie nicht sicher sind, dass Sie nicht durch ein Praktikum gestört werden.

Betrachten Sie ein weiteres Beispiel, das selbst bei veränderlichen Typen zeigt, dass das Zeigen einer Variablen auf etwas Neues die alte Variable immer noch nicht ändert:

%Vor%

Wenn Sie eine Liste aufteilen (wenn Sie : verwenden), wird eine Kopie erstellt.

    
agf 12.08.2011, 22:39
quelle
3

Die Aufgabe wird niemals kopiert. Es verbindet nur das Objekt a , das auf das Beispiel verweist, mit b . a und b verweisen auf dasselbe Objekt, bis Sie die Verknüpfung von eins ändern.

Es ist nützlich, "Variable" als einen Begriff zu verwenden, es ist nur eine Bezeichnung, die Sie einem Objekt zuweisen, ein Handle, mit dem Sie zum Objekt gelangen können, nicht mehr.

copy.copy ändert das überhaupt nicht.

Wenn Sie Änderungen auch für Zahlen oder Strings propagieren möchten - hier ist die Unveränderlichkeitshow - müssen Sie die Zahlen und Strings in ein anderes Objekt einbinden und es a und b zuordnen.

Wenn Sie umgekehrt gehen möchten, müssen Sie das Modul copy verwenden, aber lesen Sie die Dokumentation. Aber Sie müssen in Bezug auf Objekte nicht Variablen denken.

    
Michael Markert 12.08.2011 22:38
quelle

Tags und Links