为什么一组数字看起来是排序的?

2024-05-12 19:12:18 发布

您现在位置:Python中文网/ 问答频道 /正文

多次运行此代码

t = {'a', 'b', 'c', 'd'}
print(t)

可以打印如下内容:

^{2}$

(如果您正在使用控制台复制它,请确保每次在重新粘贴代码并执行它之前都单击重新运行。如果您仍然不能复制,可能您的hash randomization不等于randomOn Python 3.3 and greater, hash randomization is turned on by default.


另一方面,下面的代码总是打印同一组,并且实际上是排序的:

s = {1, 6, 3.3, 4}
print(s) 

# prints: 
# {1, 3.3, 4, 6}
# {1, 3.3, 4, 6}
# {1, 3.3, 4, 6}
# {1, 3.3, 4, 6}

问题:
为什么一组数字看起来总是排序的,它们真的总是排序的吗?在


Tags: and代码内容by排序is粘贴on
1条回答
网友
1楼 · 发布于 2024-05-12 19:12:18

注意,我手头没有python3.4,但在python2.7上,情况并不总是如此(我希望python3.4也是如此)。在

我甚至可以根据元素在集合中的放置方式更改元素的顺序:

>>> print({1, 9})
set([9, 1])
>>> print({9, 1})
set([1, 9])
>>> set([9, 1])
set([9, 1])
>>> set([1, 9])
set([1, 9])

顺序由元素的散列和插入的时间决定(在哈希冲突的情况下)。在CPython中,整数散列到自身,dict/set有8个空闲槽。因为有8个点可用,所以我们可以散列数字0->;7(包括0),而不会发生哈希冲突。但是,如果我们尝试在同一个集合中散列8和0(或9和1),就会发生冲突。如果9已经在集合中,然后我们尝试将1放入,python会看到并说“噢,snap,这个插槽已经占用了,我需要将它放入下一个最有利的插槽”。碰撞解决方案的细节超出了我的研究范围,因此我无法提供深入了解的插槽是什么。。。在

注意,如果集合中有超过5个元素,那么它将被调整大小(IIRC,到16,然后32,然后64,…),从而改变哪些元素会发生碰撞(自然)。在

相关问题 更多 >