107 votes

Ajouter un dictionnaire à une liste - je vois un comportement semblable à celui d'un pointeur

J'ai essayé ce qui suit dans l'interpréteur python :

>>> a = []
>>> b = {1:'one'}
>>> a.append(b)
>>> a
[{1: 'one'}]
>>> b[1] = 'ONE'
>>> a
[{1: 'ONE'}]

Ici, après avoir ajouté le dictionnaire b à la liste a Je modifie la valeur correspondant à la clé 1 dans le dictionnaire b . D'une manière ou d'une autre, cette modification est également répercutée dans la liste. Lorsque j'ajoute un dictionnaire à une liste, ne suis-je pas en train d'ajouter la valeur du dictionnaire ? Il semble que j'aie ajouté un pointeur sur le dictionnaire à la liste et que, par conséquent, les modifications apportées au dictionnaire se reflètent également dans la liste.

Je ne veux pas que la modification soit répercutée dans la liste. Comment faire ?

165voto

NPE Points 169956

Vous avez raison de dire que votre liste contient un référence au dictionnaire original.

a.append(b.copy()) devrait faire l'affaire.

Gardez à l'esprit qu'il s'agit d'une copie superficielle. Une alternative consiste à utiliser copy.deepcopy(b) ce qui permet d'effectuer une copie en profondeur.

40voto

eyquem Points 9942

Egalement avec dictée

a = []
b = {1:'one'}

a.append(dict(b))
print a
b[1]='iuqsdgf'
print a

resultado

[{1: 'one'}]
[{1: 'one'}]

3voto

Efazati Points 2507

Utiliser la copie et la copie profonde

http://docs.python.org/library/copy.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X