Tiefe Kopie eines Diktats in Python


Answers

dict.copy () ist eine flache Kopierfunktion für das Wörterbuch
ID ist eine eingebaute Funktion, die Ihnen die Adresse der Variablen gibt

Zuerst müssen Sie verstehen, "warum ist dieses spezielle Problem passiert?"

In [1]: my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}

In [2]: my_copy = my_dict.copy()

In [3]: id(my_dict)
Out[3]: 140190444167808

In [4]: id(my_copy)
Out[4]: 140190444170328

In [5]: id(my_copy['a'])
Out[5]: 140190444024104

In [6]: id(my_dict['a'])
Out[6]: 140190444024104

Die Adresse der Liste, die in beiden Diktaten für den Schlüssel "a" vorhanden ist, zeigt auf denselben Ort.
Wenn Sie also den Wert der Liste in my_dict ändern, ändert sich auch die Liste in my_copy.

Lösung:

In [7]: my_copy = {key: value[:] for key, value in my_dict.items()}

In [8]: id(my_copy['a'])
Out[8]: 140190444024176

Oder Sie können decopy wie oben erwähnt verwenden.

Question

Ich würde gerne eine dict Kopie eines dict in Python machen. Leider ist die Methode .deepcopy() für das .deepcopy() nicht vorhanden. 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 3 .

Ich möchte, dass Änderungen in my_dict keinen Einfluss auf den Snapshot my_copy .

Wie mache ich das? Die Lösung sollte mit Python 3.x kompatibel sein.




Eine einfachere (meiner Meinung nach) Lösung besteht darin, ein neues Wörterbuch zu erstellen und es mit dem Inhalt des alten zu aktualisieren:

my_dict={'a':1}

my_copy = {}

my_copy.update( my_dict )

my_dict['a']=2

my_dict['a']
Out[34]: 2

my_copy['a']
Out[35]: 1

Das Problem bei diesem Ansatz ist, dass es 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, wo es möglicherweise nicht tief genug ist:

my_dict1={'b':2}

my_dict2={'c':3}

my_dict3={ 'b': my_dict1, 'c':my_dict2 }

my_copy = {}

my_copy.update( my_dict3 )

my_dict1['b']='z'

my_copy
Out[42]: {'b': {'b': 'z'}, 'c': {'c': 3}}

Mit Deepcopy () kann ich das semi-flache Verhalten eliminieren, aber ich denke, man muss entscheiden, welcher Ansatz für Ihre Anwendung geeignet ist. In den meisten Fällen mag es Ihnen egal sein, aber Sie sollten sich der möglichen Fallstricke bewusst sein ... letztes Beispiel:

import copy

my_copy2 = copy.deepcopy( my_dict3 )

my_dict1['b']='99'

my_copy2
Out[46]: {'b': {'b': 'z'}, 'c': {'c': 3}}





Related