如果集合是无序的,为什么python集以"相同"的顺序显示?

pal*_*dot 4 python set python-internals

我首先看一下Python wikibook中的python语言.

对于集合,提到以下内容 - We can also have a loop move over each of the items in a set. However, since sets are unordered, it is undefined which order the iteration will follow.

并给出了代码示例

s = set("blerg")

for letter in s:
     print letter
Run Code Online (Sandbox Code Playgroud)

输出:

 r b e l g
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,无论我运行多少次,我都会以相同的顺序得到结果.如果集合是无序的并且迭代顺序未定义,为什么它以相同的顺序返回集合?订单的基础是什么?

[ PS:对不起,如果我误解了一些非常基本的东西.我是一个蟒蛇新手]

Mar*_*ers 11

它们不是随机订购的,它们是任意订购的.这意味着您不应指望维护插入的顺序,因为实际的内部实现细节决定了顺序.

顺序取决于集合的插入和删除历史记录.

在CPython中,集合使用散列表,其中插入的值基于hash()函数返回的值插入稀疏表,以表大小和冲突处理算法为模.列出设置内容然后返回此表中排序的值.

如果你想深入了解细节技术细节,那么看看为什么字典中的顺序和任意设置?; 集合的核心是字典,其中键是set值,并且没有关联的字典值.实际的实现与往常一样复杂一点,但这个答案足以让你在那里大部分时间.然后查看其余详细信息的C源代码set.

将此与列表进行比较,列表具有您可以影响的固定订单; 您可以在列表中移动项目,并为您维护新的订单.