Ich möchte eine tiefe Kopie von a dict
in Python machen. Leider existiert die .deepcopy()
Methode für die nicht dict
. Wie mache ich das?
>>> my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
>>> my_copy = my_dict.deepcopy()
Traceback (most recent calll last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'deepcopy'
>>> my_copy = my_dict.copy()
>>> my_dict['a'][2] = 7
>>> my_copy['a'][2]
7
Die letzte Zeile sollte sein 3
.
Ich möchte, dass Änderungen in my_dict
den Schnappschuss nicht beeinflussen my_copy
.
Wie mache ich das? Die Lösung sollte mit Python 3.x kompatibel sein.
python
python-3.x
Olivier Grégoire
quelle
quelle
Antworten:
Wie wäre es mit:
Python 2 oder 3:
quelle
copy.deepcopy
ist auch, dass es nicht threadsicher ist. Das habe ich auf die harte Tour gelernt. Auf der anderen Seite, je nach Anwendungsfall,json.loads(json.dumps(d))
ist Thread - sicher und funktioniert gut.json.loads
das Problem nicht für alle Anwendungsfälle gelöst wird, in denen Python-dict
Attribute nicht JSON-serialisierbar sind. Es mag denen helfen, die sich nur mit einfachen Datenstrukturen befassen, beispielsweise mit einer API, aber ich denke nicht, dass es ausreicht, um die Frage des OP vollständig zu beantworten.dict.copy () ist eine flache Kopierfunktion für die integrierte Wörterbuch-
ID , die Ihnen die Adresse der Variablen gibt
Zuerst müssen Sie verstehen, warum dieses spezielle Problem auftritt.
Die Adresse der Liste in beiden Diktaten für Schlüssel 'a' zeigt auf dieselbe Stelle.
Wenn Sie den Wert der Liste in my_dict ändern, ändert sich daher auch die Liste in my_copy.
Lösung für die in der Frage erwähnte Datenstruktur:
Oder Sie können Deepcopy wie oben erwähnt verwenden.
quelle
value[:]
. Die Lösung war eher für die in der Frage erwähnte Datenstruktur als für eine universelle Lösung.Python 3.x.
von copy import deepcopy
Ohne Deepcopy kann ich das Hostnamen-Wörterbuch nicht aus meinem Domain-Wörterbuch entfernen.
Ohne Deepcopy erhalte ich folgenden Fehler:
... wenn ich versuche, das gewünschte Element aus meinem Wörterbuch in einem anderen Wörterbuch zu entfernen.
Domain ist ein Wörterbuchobjekt
Beispielausgabe: [orginal] domain = {'localdomain': {'localhost': {'all': '4000'}}}
[neue] Domains = {'localdomain': {}}}
Was hier also vor sich geht, ist, dass ich über eine Kopie eines Wörterbuchs iteriere, anstatt über das Wörterbuch selbst zu iterieren. Mit dieser Methode können Sie Elemente nach Bedarf entfernen.
quelle
Ich mag und habe viel von Lasse V. Karlsen gelernt. Ich habe es in das folgende Beispiel geändert, das den Unterschied zwischen flachen Wörterbuchkopien und tiefen Kopien ziemlich gut hervorhebt:
Nun, wenn Sie sich ändern
und TU
du erhältst
quelle
Eine einfachere (meiner Ansicht nach) Lösung besteht darin, ein neues Wörterbuch zu erstellen und es mit dem Inhalt des alten zu aktualisieren:
Das Problem bei diesem Ansatz ist, dass er möglicherweise nicht tief genug ist. dh ist nicht rekursiv tief. gut genug für einfache Objekte, aber nicht für verschachtelte Wörterbücher. Hier ist ein Beispiel, bei dem es möglicherweise nicht tief genug ist:
Mit Deepcopy () kann ich das halbflache Verhalten beseitigen, aber ich denke, man muss entscheiden, welcher Ansatz für Ihre Anwendung geeignet ist. In den meisten Fällen ist es Ihnen vielleicht egal, aber Sie sollten sich der möglichen Fallstricke bewusst sein ... letztes Beispiel:
quelle
my_dict.copy()
!