Maison > développement back-end > Tutoriel Python > 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
Libérer: 2024-10-25 15:56:02
original
345 Les gens l'ont consulté

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]}
Copier après la connexion

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: []}
Copier après la connexion

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)
Copier après la connexion

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
Copier après la connexion

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))
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal