在python中迭代序列时删除

时间:2014-02-16 08:34:13

标签: python list python-2.7 set

任何人都可以解释removing items from a list的工作原理以及为什么removing items from a set不起作用?

虽然我们可以迭代列表和集合,但为什么不能对集合进行更改?是因为套装没有订购吗?

1 个答案:

答案 0 :(得分:0)

引擎盖下SET实现与LIST完全不同。

列表: Python的列表是可变长度数组,而不是Lisp样式的链表。该实现使用对其他对象的连续引用数组,并在列表头结构中保留指向此数组和数组长度的指针。

设置:集合使用哈希表作为其底层数据结构。就像一本字典但具有虚拟值。我们使用密钥作为列表中的元素。

Dictionaries or Set 实现 tp_iter 插槽,该插槽返回一个迭代字典键的高效迭代器。在这样的迭代期间,不应修改字典或集合,除了设置现有密钥的值是 允许(删除或添加不是,也不是update()方法)。这意味着我们可以写

所以,当你在迭代一套

>>> for i in s:
...     s.pop()
...
0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: Set changed size during iteration
>>>

但是如果您使用while,则可以删除或更新它:

>>> s = set(range(5))
>>> while s:
...     s.pop()
...     print s
...
0
set([1, 2, 3, 4])
1
set([2, 3, 4])
2
set([3, 4])
3
set([4])
4
set([])
>>>

You can see here in the source code:

相关问题