0
votes

Pourquoi un dictionnaire python imbriqué ne fonctionne-t-il pas s'il est créé avec une boucle à boucle lorsque vous souhaitez modifier une valeur?

Si j'ai un dictionnaire python imbriqué créé en écrivant toutes les clés et toutes les valeurs, je peux ensuite modifier une valeur dans un dictionnaire interne par les éléments suivants: Maindict [Everykey] [innerget] = NewValue . Mais si je crée exactement le même dictionnaire avec les boucles pour les boucles, lorsque j'essaie de changer une valeur intérieure, il est changé pour tous les dictionnaires intérieurs. Pourquoi est-ce?

J'ai testé pour obtenir les valeurs et le type de valeurs de chaque partie de cela et que tous semblent être exactement les mêmes pour un dictionnaire imbriqué explicitement écrit et pour un dictionnaire imbriqué écrit avec les boucles pour les boucles.

Exemple1 avec dictionnaire imbriqué écrit explicitement: xxx blockQuote>

résultat: {'outera': {'innera': 0, 'innerb': 0}, 'outerb': {'innera': 0, innerb ': "nouvelle valeur"}}

Exemple2 avec dictionnaire imbriqué écrit à l'aide de boucles: xxx

résultat: {'outera': {'innera': 0, 'innerb': 'nouvelle valeur'}, 'outerb': {'innera': 0, innerb ':' nouvelle valeur '}}

Notez que dans l'exemple du dictionnaire imbriqué explicitement écrit, la seule valeur modifiée est la valeur dans le dictionnaire externe "OUTERB" / Dictionary intérieur "innerb".

mais dans L'exemple créé avec des boucles pour la valeur de la valeur du dictionnaire intérieur, "innerb" est modifié dans les deux dictionnaires extérieurs. Comment se peut-il? Ou suis-je le seul à obtenir ces résultats?


3 commentaires

parce que vous utilisez le même objet innerdict , vous modifiez donc une modification de tout


En terminant, si vous initialisez toutes les clés de la même valeur, vous n'avez pas besoin d'une boucle explicite du tout; Vous pouvez utiliser innerdict = dict.fromkeys (innerkeys, 0) .


D'accord merci! Je l'obtiens maintenant.


4 Réponses :


0
votes

Parce qu'ils sont le même dictionnaire, référencé de 2 endroits différents.


1 commentaires

Merci! Cela me semble évident maintenant.



0
votes

Votre boucle pour la boucle: xxx

donne à chacun des dictionnaires extérieurs une référence à le même innerdict - qui est pourquoi tout Changer en Inderdict est vu dans tous les valeurs OUTERDICT

Ceci est totalement attendu (dans le comportement "Python" conçu comme "Sense)".


1 commentaires

Merci! Je reçois le problème.



0
votes

Vous utilisez le même objet, c'est-à-dire la même référence chaque boucle de l'extérieur. Donc, lorsque vous en chanez un, vous les changez tous.

outerDict =  { outerKey : {innerKey : 0 for innerKey in innerKeys} for outerKey in outerKeys}


1 commentaires

Grande solution! Merci beaucoup!



0
votes

Comme @scott Hunter dit que vous utilisez 2 vous référencé de 2 places différents.

Vous devez savoir comment Python gère Mutable vs objets immuables .


1 commentaires

Merci! Je comprends maintenant.