Maison  >  Article  >  développement back-end  >  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
DDDoriginal
2024-10-21 15:22:30966parcourir

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

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

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!

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