web-dev-qa-db-fra.com

python: Ajout d'un dictionnaire à une liste - Je vois un pointeur semblable à un comportement

J'ai essayé ce qui suit dans l'interprète 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 change la valeur correspondant à la clé 1 du dictionnaire 'a'. D'une manière ou d'une autre, ce changement est également reflété dans la liste. Lorsque j'ajoute un dictionnaire à une liste, ne suis-je pas simplement en train d'ajouter la valeur du dictionnaire? Il semble que j'ai ajouté un pointeur au dictionnaire dans la liste et que, par conséquent, les modifications apportées au dictionnaire sont également reflétées dans la liste.

Je ne veux pas que le changement soit reflété dans la liste. Comment fait-on ça?

Merci pour votre temps!

55
neo29

Vous avez raison de dire que votre liste contient une référence au dictionnaire d'origine.

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

Gardez à l'esprit que cela fait une copie superficielle. Une alternative consiste à utiliser copy.deepcopy(b) , qui crée une copie en profondeur.

103
NPE

Aussi avec dict

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

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

résultat

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

utiliser copie et copie profonde

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

1
Mohammad Efazati