Voici quelques options de titre, jouant sur les aspects « mystère » et « comportement inattendu » : * Pourquoi « dict.fromkeys » agit-il si étrangement avec les objets mutables ? * Le mystère de `d

DDD
Libérer: 2024-10-26 14:52:03
original
923 Les gens l'ont consulté

Here are a few title options, playing on the

Dévoilement du mystère de dict.fromkeys et des objets mutables

La fonction dict.fromkeys en Python peut se comporter de manière inattendue lorsqu'elle est utilisée avec des objets mutables, comme le démontre l'exemple suivant :

<code class="python">xs = dict.fromkeys(range(2), [])
xs[0].append(1)
# xs now contains {0: [1], 1: [1]} instead of {0: [1], 1: []}</code>
Copier après la connexion

Le comportement déroutant

Ce comportement contredit apparemment celui des compréhensions de dictionnaire, qui préservent des valeurs distinctes pour chaque clé :

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

Comprendre l'écart

La principale différence réside dans la manière dont ces deux méthodes créent des dictionnaires. Dans Python 2.6 (et versions antérieures), dict.fromkeys fait référence au même objet mutable pour toutes les clés, tandis que les compréhensions de dictionnaire créent des objets distincts pour chaque clé.

Le résultat est que lorsque xs[0] est muté dans le premier Par exemple, le changement est reflété dans xs[1] car ils font référence au même objet de liste. En revanche, dans le deuxième exemple, les listes sont distinctes, donc la mutation de xs[0] n'affecte pas xs[1].

Éviter la surprise

Pour éviter Ce comportement inattendu, il est recommandé d'utiliser les compréhensions du dictionnaire autant que possible. Si les compréhensions de dictionnaire ne sont pas disponibles (par exemple, dans Python 2.6), créer des objets distincts à l'aide d'une expression génératrice avec la fonction dict est une alternative :

<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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!