Ich setze dict2 = dict1
. Wenn ich dict2
bearbeite, ändert sich auch das Original dict1
. Warum?
>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict1
>>> dict2["key2"] = "WARUM?!"
>>> dict1
{'key2': 'WARUM?!', 'key1': 'value1'}
Ich setze dict2 = dict1
. Wenn ich dict2
bearbeite, ändert sich auch das Original dict1
. Warum?
>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict1
>>> dict2["key2"] = "WARUM?!"
>>> dict1
{'key2': 'WARUM?!', 'key1': 'value1'}
Dies hat mich anfangs auch verwirrt, weil ich aus einem C-Hintergrund kam.
In C ist eine Variable ein Speicherort mit einem definierten Typ. Das Zuweisen an eine Variable kopiert die Daten in den Speicherort der Variablen.
Aber in Python verhalten sich Variablen eher wie Zeiger auf Objekte. Daher macht das Zuweisen einer Variablen an eine andere keine Kopie, sondern lässt diesen Variablennamen auf dasselbe Objekt zeigen.
dict1
ist ein Symbol, das auf ein zugrunde liegendes Wörterbuchobjekt verweist. Das Zuweisen von dict1
an dict2
weist einfach nur dieselbe Referenz zu. Das Ändern des Werts eines Schlüssels über das Symbol dict2
ändert das zugrunde liegende Objekt, was sich auch auf dict1
auswirkt. Das ist verwirrend.
Es ist viel einfacher über unveränderliche Werte nachzudenken als über Referenzen, daher mache Kopien, wann immer möglich:
person = {'name': 'Mary', 'age': 25}
one_year_later = {**person, 'age': 26} # ändert nicht das person-Wörterbuch
Dies ist syntaktisch dasselbe wie:
one_year_later = dict(person, age=26)
Jede Variable in Python (so etwas wie dict1
oder str
oder __builtins__
) ist ein Zeiger auf ein verborgenes platonsiches "Objekt" innerhalb der Maschine.
Wenn du dict1 = dict2
setzt, zeigst du einfach dict1
auf dasselbe Objekt (bzw. Speicherort oder welche Analogie auch immer du bevorzugst) wie dict2
. Jetzt ist das Objekt, auf das dict1
verweist, dasselbe Objekt, auf das dict2
verweist.
Überprüfen kannst du es so: dict1 is dict2
sollte True
sein. Außerdem sollte id(dict1)
dasselbe sein wie id(dict2)
.
Stattdessen möchtest du dict1 = copy(dict2)
oder dict1 = deepcopy(dict2)
verwenden.
Der Unterschied zwischen copy
und deepcopy
? deepcopy
stellt sicher, dass die Elemente von dict2
(hast du es auf eine Liste gelegt?) auch Kopien sind.
Ich verwende deepcopy
nicht oft - es ist in der Regel schlechte Praxis, Code zu schreiben, der es benötigt (meiner Meinung nach).
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.