理解 Python 集合中的表观顺序
虽然 Python 集合本质上是无序的,但看似一致的显示顺序引发了问题。本文探讨了这种明显排序背后的机制。
哈希和内存放置
Python 使用哈希来确定集合中元素的内存放置。计算每个元素的哈希值,并将最后 N 位(由集合的大小确定)用作数组索引。这解释了为什么具有特定哈希值的元素最终会出现在特定的内存位置。
冲突解决
当发生哈希冲突时(当两个元素具有相同的哈希值时),冲突解决算法介入。该算法确定哪些元素占据“最佳”内存位置。解析过程部分决定了集合中元素的顺序。
插入顺序(Python 3.6 及更高版本)
从 CPython 3.6 开始,获得字典(不是集合)保留迭代插入顺序的能力。此功能允许元素按照插入的顺序进行迭代,即使它们的哈希值冲突。但是,此插入顺序保留目前尚未扩展到集合。
示例
考虑以下示例:
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])
在这种情况下,一致的排序是由于所有元素的哈希值相同。哈希冲突会导致相同的冲突解决方案,从而导致相同的排序。
但是,这种排序无法保证,并且如果元素以不同的顺序插入或哈希发生更改,则这种排序可能会发生变化。例如:
list1 = [8, 16, 24] set(list1) # prints set([8, 16, 24]) list2 = [24, 16, 8] set(list2) # prints set([24, 16, 8])
第二组中的反向排序是由于对输入列表重新排序而导致不同的碰撞解决结果的结果。
结论
Python 集合中的表观顺序源自哈希、内存放置和冲突解决的组合。虽然不能保证插入顺序,但由于哈希一致性和冲突解决结果,它可能会出现在某些场景中。
以上是为什么 Python 集合看起来有顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!