Maison  >  Article  >  développement back-end  >  Pourquoi « dict.fromkeys » avec des valeurs mutables crée-t-il des objets partagés ?

Pourquoi « dict.fromkeys » avec des valeurs mutables crée-t-il des objets partagés ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 03:16:27142parcourir

Why Does `dict.fromkeys` With Mutable Values Create Shared Objects?

Objets mutables et création de dictionnaires avec fromkeys

Le comportement observé lors de l'utilisation de dict.fromkeys pour créer des dictionnaires avec des objets mutables, tels que des listes, peut surprendre au début. L'exemple suivant illustre le problème :

<code class="python">xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: [1]}</code>

Dans ce cas, nous créons un dictionnaire avec deux clés (0 et 1) et une liste vide pour chaque valeur. Cependant, lorsque nous ajoutons un élément à la liste associée à la clé 0, il apparaît également dans la liste associée à la clé 1.

Pour comprendre ce comportement, il est important de noter que dict.fromkeys partage le même objet de valeur entre toutes les touches. Dans notre exemple, xs[0] et xs[1] pointent vers le même objet de liste, comme indiqué ci-dessous :

<code class="python">print(xs[0] is xs[1])  # Outputs: True</code>

Par conséquent, toutes les modifications apportées à la liste via xs[0] sont également reflétées dans xs[1] car ils font référence au même objet sous-jacent.

En revanche, utiliser une compréhension de dictionnaire pour créer un dictionnaire avec des objets mutables fait que chaque valeur est un objet distinct :

<code class="python">xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: []}</code>

Dans ce cas, xs[0] et xs[1] ne sont pas le même objet, donc la modification de xs[0] n'affecte pas xs[1].

Dans Python 2.6 ou version antérieure, lorsque les compréhensions du dictionnaire ne sont pas disponibles, vous pouvez utiliser une expression génératrice avec dict() pour obtenir le même comportement qu'une compréhension de dictionnaire :

<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