Création de dictionnaire avec fromkeys et objets mutables : une tournure surprenante
La méthode fromkeys en Python est un moyen pratique de créer un dictionnaire à partir d'un séquence de clés, toutes mappées à une valeur spécifiée. Cependant, lors de l'utilisation d'objets mutables comme valeur, un comportement inattendu peut se produire.
The Curiosity
Considérez l'exemple suivant dans Python 2.6 et 3.2 :
<code class="python">xs = dict.fromkeys(range(2), []) xs[0].append(1) print(xs)</code>
À notre grande surprise, la modification de la liste associée à la première clé ([0]) affecte également la liste associée à la deuxième clé ([1]). Cela peut être déroutant puisque nous nous attendons à ce que chaque clé ait sa propre valeur indépendante.
La Révélation
La raison de ce comportement particulier réside dans le fait que la méthode fromkeys crée un nouveau dictionnaire avec des références au même objet mutable, plutôt que de créer des copies distinctes. En d'autres termes, toutes les entrées du dictionnaire pointent vers le même objet mutable sous-jacent.
La solution
Pour éviter ce problème, nous pouvons utiliser des compréhensions de dict, qui créent un nouveau liste pour chaque clé de dictionnaire :
<code class="python">xs = {i: [] for i in range(2)} xs[0].append(1) print(xs)</code>
Dans Python 2.6 et versions antérieures, nous pouvons obtenir un comportement similaire en utilisant dict() avec une expression génératrice :
<code class="python">xs = dict((i, []) for i in range(2))</code>
Cette méthode alternative crée également des listes distinctes pour chaque clé de dictionnaire.
Conclusion
Comprendre les nuances de la création de dictionnaire avec des objets mutables est essentiel pour éviter un comportement inattendu et maintenir l'intégrité des données dans le code Python. En choisissant la méthode appropriée, nous pouvons garantir que les entrées du dictionnaire sont correctement isolées et éviter les effets secondaires indésirables.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!