多次运行此代码
t = {'a', 'b', 'c', 'd'}
print(t)
可以打印如下内容:
^{2}$(如果您正在使用控制台复制它,请确保每次在重新粘贴代码并执行它之前都单击重新运行。如果您仍然不能复制,可能您的hash randomization不等于random
。On 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}
问题:
为什么一组数字看起来总是排序的,它们真的总是排序的吗?在
注意,我手头没有python3.4,但在python2.7上,情况并不总是如此(我希望python3.4也是如此)。在
我甚至可以根据元素在集合中的放置方式更改元素的顺序:
顺序由元素的散列和插入的时间决定(在哈希冲突的情况下)。在CPython中,整数散列到自身,dict/set有8个空闲槽。因为有8个点可用,所以我们可以散列数字0->;7(包括0),而不会发生哈希冲突。但是,如果我们尝试在同一个集合中散列8和0(或9和1),就会发生冲突。如果
9
已经在集合中,然后我们尝试将1
放入,python会看到并说“噢,snap,这个插槽已经占用了,我需要将它放入下一个最有利的插槽”。碰撞解决方案的细节超出了我的研究范围,因此我无法提供深入了解的插槽是什么。。。在注意,如果集合中有超过5个元素,那么它将被调整大小(IIRC,到16,然后32,然后64,…),从而改变哪些元素会发生碰撞(自然)。在
相关问题 更多 >
编程相关推荐