Maison > développement back-end > Tutoriel Python > Pourquoi `dict.fromkeys()` crée-t-il des objets mutables partagés en Python ?

Pourquoi `dict.fromkeys()` crée-t-il des objets mutables partagés en Python ?

Patricia Arquette
Libérer: 2024-10-25 16:27:02
original
330 Les gens l'ont consulté

 Why does `dict.fromkeys()` create shared mutable objects in Python?

Création de dictionnaires et objets mutables : comportement surprenant avec fromkeys

Lors de la création de dictionnaires à l'aide de dict.fromkeys() en Python, une situation inattendue peut surviennent lorsque des objets mutables sont utilisés comme valeurs. Prenons l'exemple suivant :

<code class="python">xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)</code>
Copier après la connexion

Malgré la création de deux objets de liste distincts en tant que valeurs pour les clés de dictionnaire 0 et 1, l'ajout d'un élément à la liste à l'index 0 l'ajoute également à la liste à l'index 1. Ceci se produit parce que fromkeys lie chaque clé à la même référence de l'objet mutable, ce qui entraîne des modifications partagées.

En revanche, les compréhensions de dictionnaire dans Python 3.2 présentent un comportement différent :

<code class="python">xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)</code>
Copier après la connexion

Ici, chaque La clé est liée à un objet de liste distinct. L'ajout d'un élément à la liste à l'index 0 n'affecte pas la liste à l'index 1.

Pourquoi la différence ?

Le comportement de fromkeys peut être compris en considérant le code équivalent suivant :

<code class="python">a = []
xs = dict.fromkeys(range(2), a)</code>
Copier après la connexion

Chaque clé du dictionnaire résultant fait référence au même objet, conduisant aux modifications partagées observées.

Pour obtenir le comportement souhaité d'objets mutables distincts pour chaque clé , utilisez les compréhensions de dictionnaire ou, pour Python 2.6 et versions antérieures sans compréhensions de dictionnaire, utilisez dict() avec une expression génératrice :

<code class="python">xs = dict((i, []) for i in range(2))</code>
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!

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