Maison > développement back-end > Tutoriel Python > Pourquoi le comportement de classement des dictionnaires a-t-il changé entre Python 2.7 et 3.3, et comment a-t-il évolué plus tard ?

Pourquoi le comportement de classement des dictionnaires a-t-il changé entre Python 2.7 et 3.3, et comment a-t-il évolué plus tard ?

DDD
Libérer: 2024-10-21 15:22:30
original
1068 Les gens l'ont consulté

Why Did the Dictionary Ordering Behavior Change Between Python 2.7 and 3.3, and How Did It Evolve Later?

Ordre des dictionnaires dans Python 2.7 vs Python 3.3 : pourquoi ce changement ?

Dans Python 2.7, l'ordre des clés du dictionnaire était arbitraire mais cohérent . Cependant, ce comportement a changé dans Python 3.3, où l'ordre des clés obtenues à partir de méthodes comme vars() semble non déterministe.

Ce non-déterminisme découle d'un correctif de sécurité implémenté en 2012, qui était activé par défaut. en Python 3.3. Le correctif a introduit la randomisation du hachage pour éviter certaines vulnérabilités de sécurité. En conséquence, l'ordre d'itération des dictionnaires et des ensembles est devenu imprévisible.

Dans Python 3.6, une nouvelle implémentation pour la classe dict a été introduite qui préserve l'ordre d'insertion. Par conséquent, depuis Python 3.7, le comportement de préservation de l'ordre pour les dictionnaires est désormais garanti.

Cohérence inattendue dans certains cas d'utilisation

Malgré l'ordre non déterministe, il existe cas où un ordre cohérent est maintenu. Par exemple :

list({str(i): i for i in range(10)}.keys())
Copier après la connexion

Dans Python 2.7 et Python 3.6 (et versions ultérieures), cette expression produit systématiquement l'ordre :

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
Copier après la connexion

C'est parce que le contre-exemple utilise une compréhension ensembliste, qui crée un dictionnaire ordonné implicite. Dans Python 3.3, cependant, l'ordre peut encore varier en raison des limitations dans la gestion des collisions de hachage.

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
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal