Pour copier un dictionnaire en python, il faut être prudent car il existe plusieurs méthodes avec des propriétés différentes:
Copier un dictionnaire avec deepcopy
Si on veut faire une copie d'un dictionnaire mais que cette copie soit complètement indépendante, il faut utiliser la fonction deepcopy
>>> import copy
>>> d1 = {'a':1}
>>> d2 = copy.deepcopy(d1)
>>> d2
{'a': 1}
Si on modifie d2 alors d1 n'est pas modifié et inversement, exemples:
>>> d2['a'] = 7
>>> d2
{'a': 7}
>>> d1
{'a': 1}
autre exemple
>>> d1 = {'a':[1,2,3,4]}
>>> d2 = copy.deepcopy(d1)
>>> d2['a'].append(5)
>>> d2
{'a': [1, 2, 3, 4, 5]}
>>> d1
{'a': [1, 2, 3, 4]}
Copier un dictionnaire avec une boucle for
On peut aussi itérer, avec une boucle for, sur un dictionnaire pour le copier:
>>> d1 = {'a':1,'b':2}
>>> d2 = {}
>>> for key in d1:
... d2[key] = d1[key]
...
Si les valeurs associées aux clés du dictionnaire ne sont pas des objects itérables alors si on modifie d2 alors d1 n'est pas modifié et inversement
>>> d2
{'a': 1, 'b': 2}
>>> d2['a'] = 7
>>> d2
{'a': 7, 'b': 2}
>>> d1
{'a': 1, 'b': 2}
ATTENTION: Cependant si les valeurs associées aux clés du dictionnaire sont des objects itérables, comme des listes par exemple, alors si on modifie d2 alors d1 va aussi être modifié et inversement (on parle alors de copie dite "peu profonde" (shallow copy)), exemple:
>>> d1 = {'a':[1,2,3],'b':[10,11,12]}
>>> d2 = {}
>>> for key in d1:
... d2[key] = d1[key]
...
>>> d2
{'a': [1, 2, 3], 'b': [10, 11, 12]}
>>> d2['a'].append(4)
>>> d2
{'a': [1, 2, 3, 4], 'b': [10, 11, 12]}
>>> d1
{'a': [1, 2, 3, 4], 'b': [10, 11, 12]}
Dans notre exemple pour éviter cela on peut alors simplement utiliser la fonction copy() dans la boucle for, exemple:
>>> d1 = {'a':[1,2,3],'b':[10,11,12]}
>>> d2 = {}
>>> for key in d1:
... d2[key] = d1[key].copy()
...
>>> d2
{'a': [1, 2, 3], 'b': [10, 11, 12]}
>>> d2['a'].append(4)
>>> d2
{'a': [1, 2, 3, 4], 'b': [10, 11, 12]}
>>> d1
{'a': [1, 2, 3], 'b': [10, 11, 12]}
Copier un dictionnaire avec la fonction copy
Pour copier un dictionnaire on peut aussi utiliser la fonction python copy():
>>> d1 = {'a':1}
>>> d2 = d1.copy()
>>> d2
{'a': 1}
Mais copy() est également d'une copie dite "peu profonde" (shallow copy), si les valeurs associées aux clés du dictionnaire ne sont pas des objects itérables alors si on modifie d2 alors d1 n'est pas modifié et inversement
>>> d2['a']=7
>>> d2
{'a': 7}
>>> d1
{'a': 1}
Par contre, si les valeurs associées aux clés du dictionnaire sont des objects itérables, comme des listes par exemple, alors si on modifie d2 alors d1 va aussi être modifié et inversement:
>>> d1 = {'a':[1,2,3]}
>>> d2 = d1.copy()
>>> d2
{'a': [1, 2, 3]}
>>> d2['a'].append(4)
>>> d2
{'a': [1, 2, 3, 4]}
>>> d1
{'a': [1, 2, 3, 4]}
Copier un dictionnaire avec la fonction dict()
Meme propriétés avec la fonction dict(), exemples:
>>> d1 = {'a':1}
>>> d2 = dict(d1)
>>> d2['a']=7
>>> d2
{'a': 7}
>>> d1
{'a': 1}
Autre exemple:
>>> d1 = {'a':[1,2,3]}
>>> d2 = dict(d1)
>>> d2
{'a': [1, 2, 3]}
>>> d2['a'].append(4)
>>> d2
{'a': [1, 2, 3, 4]}
>>> d1
{'a': [1, 2, 3, 4]}
Copier un dictionnaire avec l'opérateur =
Si on utilise l'opérateur = pour copier un dictionnaire , on ne copie pas vraiment celui ci, on a plutôt un dictionnaire avec deux noms différents et si on modifie un dictionnaire, l'autre est aussi modifié, exemples;
>>> d1 = {'a':1}
>>> d2 = d1
>>> d2
{'a': 1}
>>> d2['a'] = 7
>>> d2['c'] = 3
>>> d2
{'a': 7, 'c': 3}
>>> d1
{'a': 7, 'c': 3}
Références
Liens | Site |
---|---|
How to copy a dictionary and only edit the copy | stackoverflow |
copy — Shallow and deep copy operations | python doc |
Description | tutorialspoint |
Be careful with using dict() to create a copy | peterbe.com |