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

52voto

Akay Nirala Punkte 1106

Die besten und einfachsten Möglichkeiten, um eine Kopie eines dict sowohl in Python 2.7 als auch in 3 zu erstellen, sind...

Um eine Kopie eines einfachen (einstufigen) Wörterbuchs zu erstellen:

1. Verwenden der Methode dict(), anstatt einen Verweis zu generieren, der auf das vorhandene Wörterbuch zeigt.

my_dict1 = dict()
my_dict1["message"] = "Hallo Python"
print(my_dict1)  # {'message':'Hallo Python'}

my_dict2 = dict(my_dict1)
print(my_dict2)  # {'message':'Hallo Python'}

# Änderungen in my_dict1 vorgenommen
my_dict1["name"] = "Emrit"
print(my_dict1)  # {'message':'Hallo Python', 'name' : 'Emrit'}
print(my_dict2)  # {'message':'Hallo Python'}

2. Verwenden der integrierten Methode update() des Python-Wörterbuches.

my_dict2 = dict()
my_dict2.update(my_dict1)
print(my_dict2)  # {'message':'Hello Python'}

# Änderungen in my_dict1 vorgenommen
my_dict1["name"] = "Emrit"
print(my_dict1)  # {'message':'Hello Python', 'name' : 'Emrit'}
print(my_dict2)  # {'message':'Hello Python'}

Um eine Kopie eines verschachtelten oder komplexen Wörterbuchs zu erstellen:

Verwenden Sie das integrierte copy-Modul, das generische Shallow- und Deep-Kopieroperationen bereitstellt. Dieses Modul ist sowohl in Python 2.7 als auch in 3.* vorhanden.

import copy

my_dict2 = copy.deepcopy(my_dict1)

40voto

Sie können auch einfach ein neues Wörterbuch mit einer Wörterbuch-Komprehension erstellen. Dies vermeidet das Importieren von Kopie.

dout = dict((k,v) for k,v in mydict.items())

Natürlich können Sie in Python >= 2.7 auch folgendes tun:

dout = {k:v for k,v in mydict.items()}

Aber für Abwärtskompatibilität ist die obige Methode besser.

33voto

d4rty Punkte 3630

Zusätzlich zu den anderen bereitgestellten Lösungen können Sie ** verwenden, um das Wörterbuch in ein leeres Wörterbuch zu integrieren, z. B.,

`shallow_copy_of_other_dict = {other_dict}`**.

Jetzt haben Sie eine "flache" Kopie von other_dict.

Auf Ihr Beispiel angewendet:

>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = {**dict1}
>>> dict2
{'key1': 'value1', 'key2': 'value2'}
>>> dict2["key2"] = "WHY?!"
>>> dict1
{'key1': 'value1', 'key2': 'value2'}
>>>

Hinweis: Unterschied zwischen flachen und tiefen Kopien

22voto

loosen Punkte 321

Assignierungsanweisungen in Python kopieren keine Objekte, sie erstellen Bindungen zwischen einem Ziel und einem Objekt.

Also, dict2 = dict1, es entsteht eine weitere Bindung zwischen dict2 und dem Objekt, auf das dict1 verweist.

Wenn Sie ein Dictionary kopieren möchten, können Sie das copy-Modul verwenden. Das Copy-Modul hat zwei Schnittstellen:

copy.copy(x)
Gibt eine oberflächliche Kopie von x zurück.

copy.deepcopy(x)
Gibt eine tiefe Kopie von x zurück.

Der Unterschied zwischen flacher und tiefer Kopie ist nur relevant für zusammengesetzte Objekte (Objekte, die andere Objekte enthalten, wie Listen oder Klasseninstanzen):

Eine flache Kopie konstruiert ein neues zusammengesetztes Objekt und fügt dann (soweit möglich) Verweise auf die Objekte darin ein, die im Original gefunden wurden.

Eine tiefe Kopie konstruiert ein neues zusammengesetztes Objekt und fügt dann rekursiv Kopien davon ein, die im Original gefunden wurden.

Zum Beispiel, in Python 2.7.9:

>>> import copy
>>> a = [1,2,3,4,['a', 'b']]
>>> b = a
>>> c = copy.copy(a)
>>> d = copy.deepcopy(a)
>>> a.append(5)
>>> a[4].append('c')

und das Ergebnis ist:

>>> a
[1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> b
[1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> c
[1, 2, 3, 4, ['a', 'b', 'c']]
>>> d
[1, 2, 3, 4, ['a', 'b']]

13voto

Frerich Raabe Punkte 85859

Sie können die neu erstellte Kopie in einem Schritt kopieren und bearbeiten, indem Sie den dict-Konstruktor mit zusätzlichen Schlüsselwortargumenten aufrufen:

>>> dict1 = {"key1": "value1", "key2": "value2"}
>>> dict2 = dict(dict1, key2="WARUM?!")
>>> dict1
{'key2': 'value2', 'key1': 'value1'}
>>> dict2
{'key2': 'WARUM?!', 'key1': 'value1'}

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