Fer*_*dox 5 python set python-3.4
多次运行此代码
t = {'a', 'b', 'c', 'd'}
print(t)
Run Code Online (Sandbox Code Playgroud)
可以打印像:
{'c', 'b', 'a', 'd'}
{'d', 'b', 'c', 'a'} # different
{'d', 'b', 'c', 'a'} # same
{'a', 'd', 'b', 'c'} # different
{'a', 'b', 'c', 'd'} # different
# etc
Run Code Online (Sandbox Code Playgroud)
(如果您使用控制台进行复制,请确保在Rerun每次重新粘贴代码并执行之前单击.如果仍然无法复制,可能您的散列随机化不等于random.在Python 3.3及更高版本上,默认情况下启用哈希随机化.)
另一方面,下面的代码总是打印相同的集合,它实际上是排序的:
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}
Run Code Online (Sandbox Code Playgroud)
问题:
为什么数字组似乎总是排序,它们是否总是排序?
请注意,我手边没有 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])
Run Code Online (Sandbox Code Playgroud)
顺序由元素的散列和插入的时间(在散列冲突的情况下)确定。在 CPython 中,整数对自身进行哈希处理,并且 dict/set 有 8 个空闲槽可以开始。由于有 8 个可用点,我们可以在没有哈希冲突的情况下对数字 0 -> 7(包括)进行哈希处理。但是,如果我们尝试对同一集合中的 8 和 0(或 9 和 1)进行散列,则会发生冲突。如果9已经在集合中,然后我们尝试放入1,python 看起来并说“哦,快点,那个位置被占用了——现在我需要把它放在下一个最有利的位置”。冲突解决的细节超出了我的研究范围,所以我无法深入了解这是什么插槽......
请注意,如果集合中有超过 5 个元素,那么它会被调整大小(IIRC,到 16,然后是 32,然后是 64,...)这会改变哪些元素会(自然地)发生碰撞。
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |