Beim Lesen der Dokumentation für dict.copy()
heißt es, dass eine flache Kopie des Wörterbuchs erstellt wird. Gleiches gilt für das Buch, dem ich folge (Beazleys Python-Referenz), in dem es heißt:
Die Methode m.copy () erstellt eine flache Kopie der in einem Zuordnungsobjekt enthaltenen Elemente und platziert sie in einem neuen Zuordnungsobjekt.
Bedenken Sie:
>>> original = dict(a=1, b=2)
>>> new = original.copy()
>>> new.update({'c': 3})
>>> original
{'a': 1, 'b': 2}
>>> new
{'a': 1, 'c': 3, 'b': 2}
Daher nahm ich an, dass dies den Wert von original
(und 'c': 3 hinzufügen) aktualisieren würde, auch da ich eine flache Kopie machte. Zum Beispiel, wenn Sie es für eine Liste tun:
>>> original = [1, 2, 3]
>>> new = original
>>> new.append(4)
>>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])
Dies funktioniert wie erwartet.
Da beide flache Kopien sind, warum dict.copy()
funktioniert das nicht so, wie ich es erwartet habe? Oder ist mein Verständnis von flachem und tiefem Kopieren fehlerhaft?
python
dictionary
copy
user225312
quelle
quelle
Antworten:
Unter "flachem Kopieren" versteht man, dass der Inhalt des Wörterbuchs nicht nach Wert kopiert wird, sondern lediglich eine neue Referenz erstellt wird.
Im Gegensatz dazu kopiert eine tiefe Kopie alle Inhalte nach Wert.
Damit:
b = a
: Referenzzuweisung, Makea
undb
zeigt auf dasselbe Objekt.b = a.copy()
: Flaches Kopierena
undb
wird zu zwei isolierten Objekten, deren Inhalt jedoch immer noch dieselbe Referenz hatb = copy.deepcopy(a)
: Tiefes Kopierena
undb
Struktur und Inhalt von werden vollständig isoliert.quelle
L
wieder in zu verwendenb
. Dies würde das Beispiel vereinfachen.b[1][0] = 5
. Wennb
es sich um eine flache Kopie handelt, haben Sie sie gerade geänderta[1][0]
.Es geht nicht um tiefe oder flache Kopien, nichts, was Sie tun, ist tiefe Kopien.
Hier:
Sie erstellen einen neuen Verweis auf die Liste / das Diktat, auf die / das das Original verweist.
während hier:
Sie erstellen eine neue Liste / ein neues Diktat, das mit einer Kopie der Referenzen der im Originalcontainer enthaltenen Objekte gefüllt ist.
quelle
Nehmen Sie dieses Beispiel:
Lassen Sie uns nun einen Wert in der 'flachen' (ersten) Ebene ändern:
Ändern wir nun einen Wert eine Ebene tiefer:
quelle
no change in original, since ['a'] is an immutable integer
Diese. Es beantwortet tatsächlich die gestellte Frage.Hinzufügen zu Kennytms Antwort. Wenn Sie eine flache Kopie von parent.copy () erstellen, wird ein neues Wörterbuch mit denselben Schlüsseln erstellt, aber die Werte werden nicht kopiert, auf die verwiesen wird. Wenn Sie parent_copy einen neuen Wert hinzufügen, wirkt sich dies nicht auf parent aus, da parent_copy ein neues Wörterbuch ist keine Referenz.
Der Hash (id) -Wert von parent [1] , parent_copy [1] ist identisch, was impliziert, dass [1,2,3] von parent [1] und parent_copy [1] unter id 140690938288400 gespeichert sind.
Der Hash von parent und parent_copy ist jedoch unterschiedlich, was bedeutet, dass es sich um unterschiedliche Wörterbücher handelt. Parent_copy ist ein neues Wörterbuch mit Werten, die auf Werte von parent verweisen
quelle
"Neu" und "Original" sind unterschiedliche Diktate. Deshalb können Sie nur eines davon aktualisieren. Die Elemente werden flach kopiert, nicht das Diktat selbst.
quelle
Der Inhalt wird flach kopiert.
Wenn das Original also
dict
das einelist
oder andere enthältdictionary
, werden sie durch Ändern des Originals oder seiner flachen Kopie (deslist
oder desdict
) im anderen geändert.quelle
In Ihrem zweiten Teil sollten Sie verwenden
new = original.copy()
.copy
und=
sind verschiedene Dinge.quelle