我首先看一下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:)如果我误解了一些非常基本的东西,请原谅。我是一个蟒蛇新手]
答案 0 :(得分:11)
它们不是随机订购的,它们是任意订购的。这意味着您不应指望维护插入的顺序,因为实际的内部实现细节决定了顺序。
顺序取决于集合的插入和删除历史记录。
在CPython中,集合使用哈希表,其中插入的值基于从hash()
函数返回的值插入稀疏表,以表大小和冲突处理算法为模。列出设置内容然后返回此表中排序的值。
如果你想深入了解细节,请查看Why is the order in dictionaries and sets arbitrary?;集合的核心是字典,其中键是set
值,并且没有关联的字典值。实际的实现与往常一样复杂一点,但这个答案足以让你在那里大部分时间。然后查看其余详细信息C source code for set
。
将此与列表进行比较,列表具有您可以影响的固定订单;你可以在列表中移动项目,并为你保留新的订单。