0
votes

Dans une liste de dictionnaires, la modification d'un élément spécifique changera également tous les autres

J'ai trouvé cette étrange propriété lorsqu'on envisage une liste de dictionnaires. Considérons les éléments suivants:

my_list=[{}]*3
my_list[0]['a']=1
print my_list


1 commentaires

N'appelez pas votre variable list


3 Réponses :


1
votes

Lorsque vous créez my_list = [{}] * 3 La même référence a été prise dans n nombre de fois.

Alors, évitez de le faire lorsque vous souhaitez modifier des valeurs spécifiques.

Vous pouvez essayer comme ceci:

my_list = [{} pour i in gamme (3)]


1 commentaires

Il sera également instructif d'évaluer [id (d) pour D dans my_list] et comparer les deux cas.



0
votes
list=[{}]*3
When you are doing this you are creating the same object 3 times with the same reference. So if you change one all will be changed. In python, it is not required to declare the size of your dictionary. Just declare an empty dictionary.

0 commentaires

1
votes

Oui, cela peut sembler un peu étrange au début, mais vous devez comprendre comment les dictionnaires sont traités dans Python.

Dans la première ligne: Vous créez 3 copies de {} et stockez-le dans une liste.

Que se passe-t-il ici:

  1. Un dictionnaire vide est créé {}
  2. Le même dictionnaire est référencé et stocké 3 fois dans la liste.
  3. Vous modifiez la valeur dans le dictionnaire, cela reflète toutes les instances du dictionnaire stocké dans la liste.

    Comment travailler cela: xxx

    sortie: xxx


2 commentaires

TY! Pourquoi fonctionne-t-il seulement comme celui-ci pour les dictionnaires? Par exemple, si je fais a = 5 et my_list = [A] * 3 , alors my_list [0] = 2 ne changera que le premier élément.


@ 3SM1R des opérations complètement différentes. Dans le cas de la question, vous militatez l'objet à quel my_list [0] (c'est-à-dire le dictionnaire). Dans votre nouvel exemple, vous devez réaffecter my_list [0] pour pointer sur un objet différent (et dans tous les cas, l'objet existant auquel cela pointe, l'entier 5 est immuable ).