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
Patricia Arquetteoriginal
2024-10-25 16:27:02254parcourir

 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>

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>

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>

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>

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