Ordre des dictionnaires dans Python 2.7 vs Python 3.3 : pourquoi le 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 ']
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']Cela est dû au fait 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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3