为什么我不能更改要迭代的集合?

Agu*_*guy 3 python

我已经看到了建议的解决方案和解决方法,但是找不到关于不允许在迭代过程中更改集的选择的解释。你能帮我理解为什么可以吗

In [1]: l = [1]

In [2]: for i in l:
            l.append(2*i)
            if len(l)>10:
                    break

In [3]: l
Out[3]: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
Run Code Online (Sandbox Code Playgroud)

虽然这不行

In [4]: l = {1}

In [5]: for i in l:
            l.add(2*i)
            if len(l)>10:
                    break
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-5-b5bdff4a382b> in <module>()
----> 1 for i in l:
      2         l.add(2*i)
      3         if len(l)>10:
      4                 break
      5

RuntimeError: Set changed size during iteration
Run Code Online (Sandbox Code Playgroud)

在迭代时更改集合有什么不好?

我知道集合中的顺序未定义,因此next可能很难。这是原因吗?

Mar*_*ers 5

集合由哈希表支持(请参阅为什么Python词典中的顺序和集合是任意的?)。集合中的条目根据其哈希值插入该表,而哈希值又决定了它们的顺序。

在该哈希表中添加或删除项目会改变迭代顺序,有时会改变表的大小(可以调整表的大小(根据新表的大小重新排列所有现有条目的位置))。由于此迭代无法立即更改集合,因此无法继续。否则,您可能会再次看到相同的值,即使顺序不同。

另一方面,列表具有明确定义的顺序。插入或删除项目可以更改该顺序,但采用明确定义的方式。因此,列表迭代器可以简单地使用不断增加的索引来查找“下一个”项目,直到该索引与当前列表长度匹配为止。