Maison  >  Article  >  développement back-end  >  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

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
DDDoriginal
2024-10-26 14:52:03924parcourir

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>

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>

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>

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