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

时间:2014-02-11 12:16:42

标签: 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

输出

 r b e l g

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

[ PS:)如果我误解了一些非常基本的东西,请原谅。我是一个蟒蛇新手]

1 个答案:

答案 0 :(得分:11)

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

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

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

如果你想深入了解细节,请查看Why is the order in dictionaries and sets arbitrary?;集合的核心是字典,其中键是set值,并且没有关联的字典值。实际的实现与往常一样复杂一点,但这个答案足以让你在那里大部分时间。然后查看其余详细信息C source code for set

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