Maison  >  Article  >  développement back-end  >  Pourquoi « dict.fromkeys » de Python avec des valeurs mutables provoque-t-il un comportement inattendu ?

Pourquoi « dict.fromkeys » de Python avec des valeurs mutables provoque-t-il un comportement inattendu ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-25 15:56:02248parcourir

Why Does Python's `dict.fromkeys` With Mutable Values Cause Unexpected Behavior?

Création de dictionnaire avec fromkeys et objets mutables : une surprise inattendue

En Python 2.6 et 3.2, le comportement de dict.fromkeys avec des objets mutables peut être surprenant. Lorsqu'une liste est utilisée comme valeur, la modification d'une entrée dans le dictionnaire affecte toutes les autres entrées, comme démontré ci-dessous :

>>> xs = dict.fromkeys(range(2), [])
>>> xs
{0: [], 1: []}
>>> xs[0].append(1)
>>> xs
{0: [1], 1: [1]}

Cependant, ce comportement ne se produit pas avec les compréhensions de dict de Python 3.2 :

>>> xs = {i:[] for i in range(2)}
>>> xs
{0: [], 1: []}
>>> xs[0].append(1)
>>> xs
{0: [1], 1: []}

Raison du comportement de fromkeys

La raison apparente du comportement de fromkeys est que chaque entrée du dictionnaire résultant fait référence au même objet. La modification de l'objet via une entrée affecte toutes les autres. Cela peut être clarifié en créant le dictionnaire manuellement :

>>> a = []
>>> xs = dict.fromkeys(range(2), a)

Cela démontre que les entrées du dictionnaire font toutes référence au même objet :

>>> xs[0] is a and xs[1] is a
True

Atténuer le comportement avec les compréhensions de dict

Pour éviter ce comportement, utilisez des compréhensions de dict ou, si vous utilisez Python 2.6 ou une version antérieure, utilisez dict avec une expression génératrice :

xs = dict((i, []) for i in range(2))

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn