Comprendre l'ordre apparent dans les ensembles Python
Bien que les ensembles Python soient intrinsèquement non ordonnés, l'ordre d'affichage apparemment cohérent a soulevé des questions. Cet article explore le mécanisme derrière cet ordre apparent.
Hachage et placement de la mémoire
Python utilise le hachage pour déterminer l'emplacement de la mémoire des éléments d'un ensemble. Le hachage de chaque élément est calculé et les N derniers bits (déterminés par la taille de l'ensemble) sont utilisés comme indices de tableau. Cela explique pourquoi les éléments avec certaines valeurs de hachage se retrouvent dans des emplacements de mémoire spécifiques.
Résolution des collisions
Lorsque des collisions de hachage se produisent (lorsque deux éléments ont le même hachage), un L'algorithme de résolution de collision intervient. Cet algorithme détermine quels éléments occupent les « meilleurs » emplacements mémoire. Le processus de résolution détermine partiellement l'ordre des éléments dans l'ensemble.
Ordre d'insertion (Python 3.6 et supérieur)
À partir de CPython 3.6, les dictionnaires (et non les ensembles) ont gagné la possibilité de conserver l’ordre d’insertion pour l’itération. Cette fonctionnalité permet aux éléments d'être itérés dans le même ordre dans lequel ils ont été insérés, même si leurs hachages sont en conflit. Cependant, cette préservation de l'ordre d'insertion n'est actuellement pas étendue aux ensembles.
Exemples
Considérez les exemples suivants :
set_1 = set([5, 2, 7, 2, 1, 88]) set_2 = set([5, 2, 7, 2, 1, 88]) print(set_1) # prints set([88, 1, 2, 5, 7]) print(set_2) # prints set([88, 1, 2, 5, 7])
Dans ce cas, l'ordre cohérent est dû à des valeurs de hachage identiques pour tous les éléments. Les collisions de hachage entraînent la même résolution de collision, conduisant à un ordre identique.
Cependant, cet ordre n'est pas garanti et peut changer si des éléments sont insérés dans un ordre différent ou si les hachages changent. Par exemple :
list1 = [8, 16, 24] set(list1) # prints set([8, 16, 24]) list2 = [24, 16, 8] set(list2) # prints set([24, 16, 8])
L'ordre inverse dans le deuxième ensemble est le résultat de différents résultats de résolution de collision dus à la réorganisation de la liste d'entrée.
Conclusion
L'ordre apparent dans les ensembles Python résulte d'une combinaison de hachage, de placement de mémoire et de résolution de collision. Bien que l'ordre d'insertion ne soit pas garanti, il peut apparaître dans certains scénarios en raison de la cohérence du hachage et des résultats de résolution des collisions.
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!