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

Susan Sarandon
Libérer: 2024-10-26 03:16:27
original
249 Les gens l'ont consulté

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

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

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

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>
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