Maison >développement back-end >Tutoriel Python >Pourquoi `dict.fromkeys()` crée-t-il des objets mutables partagés en 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!