1267 Stimmen

Wie man ein Wörterbuch kopiert und nur die Kopie bearbeitet

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'}

12voto

Craig McQueen Punkte 39286

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.

9voto

Petrus Theron Punkte 26281

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)

8voto

wisty Punkte 6781

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).

7voto

dict2 = dict1 kopiert das Wörterbuch nicht. Es bietet dem Programmierer lediglich eine zweite Möglichkeit (dict2), auf dasselbe Wörterbuch zuzugreifen.

7voto

imcaozi Punkte 107
>>> dict2 = dict1
# dict2 ist an dasselbe Dict-Objekt gebunden, an das dict1 gebunden ist, daher wenn du dict2 änderst, änderst du auch dict1

Es gibt viele Möglichkeiten, ein Dict-Objekt zu kopieren, ich benutze einfach

dict_1 = {
           'a':1,
           'b':2
         }
dict_2 = {}
dict_2.update(dict_1)

CodeJaeger.com

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.

Powered by:

X