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

Python 为什么一组数字看起来是被排序的?,python,set,python-3.4,Python,Set,Python 3.4,多次运行此代码 t = {'a', 'b', 'c', 'd'} print(t) 可以打印如下内容: {'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 (如果您正在使用控制台复制它,请确保每次重新粘贴代码并执行它之前都单击“重新运行”

多次运行此代码

t = {'a', 'b', 'c', 'd'}
print(t)
可以打印如下内容:

{'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
(如果您正在使用控制台复制它,请确保每次重新粘贴代码并执行它之前都单击“重新运行”。如果仍然无法复制,则可能您没有达到
random


另一方面,下面的代码总是打印相同的集合,并且它实际上是经过排序的:

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也是如此)

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

>>> 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(包括),而不会发生散列冲突。但是,如果我们尝试在同一集中散列8和0(或9和1),我们将遇到冲突。如果
9
已经在集合中,然后我们尝试将
1
放入,python会看一眼并说“哦,天哪,这个位置被占用了——现在我需要将它放入下一个最有利的位置”。碰撞解决方案的细节超出了我的研究范围,因此我无法深入了解这是什么插槽


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

注意,
集合
基本上只是一个没有值的
dict
。它似乎只在iPython控制台中排序,而不是在普通的python控制台中排序,当遍历它或调用
str(s)
repr(s)
时。另一个可能的重复:不打印将给您不同的ordering@PadraicCunningham不知道你的意思是什么?如果我做
a={1,9};a
我仍然得到与python2.7上运行的
print({1,9})
相同的东西,这是从ipython运行的,它似乎与python不同repl@PadraicCunningham--您正在使用IPython,它似乎试图为您提供帮助并对元素进行排序。如果只打印
repr(s)
(这是普通python REPL将要做的)@padraiccanningham——真正让我吃惊的是
{1,9}
集([1,9])
给出了不同的结果。。。出于某种原因,似乎只涉及文本的python集是向后读取的?