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: 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. P> résultat: {'outera': {'innera': 0, 'innerb': 0}, 'outerb': {'innera': 0, innerb ': "nouvelle valeur"}} p>
BlockQuote> résultat: {'outera': {'innera': 0, 'innerb': 'nouvelle valeur'}, 'outerb': {'innera': 0, innerb ':' nouvelle valeur '}} p>
blockQuote> 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". p> 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? P> p> Maindict [Everykey] [innerget] = NewValue code>. 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?
Exemple1 avec dictionnaire imbriqué écrit explicitement: h1>
H1>
Exemple2 avec dictionnaire imbriqué écrit à l'aide de boucles: h1>
4 Réponses :
Parce qu'ils sont le même dictionnaire, référencé de 2 endroits différents. P>
Merci! Cela me semble évident maintenant.
Votre boucle pour la boucle: donne à chacun des dictionnaires extérieurs une référence à le même em> Ceci est totalement attendu (dans le comportement "Python" conçu comme "Sense)". p> p> innerdict code> - qui est pourquoi tout Changer en
Inderdict CODE> est vu dans tous les valeurs
OUTERDICT CODE> P>
Merci! Je reçois le problème.
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}
Grande solution! Merci beaucoup!
Comme @scott Hunter dit que vous utilisez 2 vous référencé de 2 places différents. em> p>
Vous devez savoir comment Python gère Mutable vs objets immuables a>. p>
Merci! Je comprends maintenant.
parce que vous utilisez le même objet code> innerdict code>, 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) code>.
D'accord merci! Je l'obtiens maintenant.