我已经看到了建议的解决方案和解决方法,但是找不到关于不允许在迭代过程中更改集的选择的解释。你能帮我理解为什么可以吗
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可能很难。这是原因吗?
集合由哈希表支持(请参阅为什么Python词典中的顺序和集合是任意的?)。集合中的条目根据其哈希值插入该表,而哈希值又决定了它们的顺序。
在该哈希表中添加或删除项目会改变迭代顺序,有时会改变表的大小(可以调整表的大小(根据新表的大小重新排列所有现有条目的位置))。由于此迭代无法立即更改集合,因此无法继续。否则,您可能会再次看到相同的值,即使顺序不同。
另一方面,列表具有明确定义的顺序。插入或删除项目可以更改该顺序,但采用明确定义的方式。因此,列表迭代器可以简单地使用不断增加的索引来查找“下一个”项目,直到该索引与当前列表长度匹配为止。