Je voudrais faire une copie complète d'un dict
fichier en python. Malheureusement, la .deepcopy()
méthode n'existe pas pour le dict
. Comment je fais ça?
>>> 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
La dernière ligne devrait être 3
.
Je voudrais que les modifications apportées my_dict
n'affectent pas l'instantané my_copy
.
Comment je fais ça? La solution doit être compatible avec Python 3.x.
python
python-3.x
Olivier Grégoire
la source
la source
Réponses:
Que diriez-vous:
Python 2 ou 3:
la source
copy.deepcopy
thread n'est pas sûr. J'ai appris cela à la dure. En revanche, en fonction de votre cas d'utilisation,json.loads(json.dumps(d))
est thread-safe et fonctionne bien.json.loads
cela ne résout pas le problème pour tous les cas d'utilisation où lesdict
attributs python ne sont pas sérialisables JSON. Cela peut aider ceux qui ne traitent que de structures de données simples, à partir d'une API par exemple, mais je ne pense pas que ce soit une solution suffisante pour répondre pleinement à la question du PO.dict.copy () est une fonction de copie superficielle pour le dictionnaire
id est une fonction intégrée qui vous donne l'adresse de la variable
Vous devez d'abord comprendre "pourquoi ce problème se produit-il?"
L'adresse de la liste présente dans les deux dict pour la clé «a» pointe vers le même emplacement.
Par conséquent, lorsque vous modifiez la valeur de la liste dans my_dict, la liste dans my_copy change également.
Solution pour la structure de données mentionnée dans la question:
Ou vous pouvez utiliser la copie profonde comme mentionné ci-dessus.
la source
value[:]
. La solution a été pour la structure de données particulière mentionnée dans la question plutôt que pour une solution universelle.Python 3.x
à partir de l'importation de copie en profondeur
Sans deepcopy, je ne peux pas supprimer le dictionnaire de noms d'hôte de mon dictionnaire de domaine.
Sans deepcopy, j'obtiens l'erreur suivante:
... lorsque j'essaie de supprimer l'élément souhaité de mon dictionnaire à l'intérieur d'un autre dictionnaire.
domaine est un objet dictionnaire
Exemple de sortie: [orginal] domain = {'localdomain': {'localhost': {'all': '4000'}}}
[nouveau] domaines = {'domaine local': {}}}
Donc, ce qui se passe ici, c'est que j'itère sur une copie d'un dictionnaire plutôt que sur le dictionnaire lui-même. Avec cette méthode, vous pouvez supprimer des éléments selon vos besoins.
la source
J'aime et j'ai beaucoup appris de Lasse V. Karlsen. Je l'ai modifié dans l'exemple suivant, qui souligne assez bien la différence entre les copies de dictionnaire peu profondes et les copies profondes:
Maintenant, si vous changez
et fait
vous obtenez
la source
Une solution plus simple (à mon avis) consiste à créer un nouveau dictionnaire et à le mettre à jour avec le contenu de l'ancien:
Le problème avec cette approche est qu'elle n'est peut-être pas «assez profonde». c'est-à-dire n'est pas récursivement profond. assez bon pour les objets simples mais pas pour les dictionnaires imbriqués. Voici un exemple où il peut ne pas être assez profond:
En utilisant Deepcopy (), je peux éliminer le comportement semi-superficiel, mais je pense qu'il faut décider quelle approche convient à votre application. Dans la plupart des cas, vous ne vous en souciez peut-être pas, mais vous devez être conscient des pièges possibles ... dernier exemple:
la source
my_dict.copy()
!