迭代器失效的规则是什么?

时间:2016-06-23 22:46:31

标签: python xml iterator

是否存在所有模块都遵循的一般规则?

In my case,我正在使用Python xml.etree library

我们这样说:

for el in root.iter('*'):
    for subel in el:
        el.remove(subel)

这会破坏el迭代器吗?

1 个答案:

答案 0 :(得分:2)

在很多情况下,迭代迭代时修改迭代会导致问题。 Here's在迭代期间删除元素时,XML树的迭代被搞乱的示例。在stackoverflow上有很多问题,当你在列表上进行迭代时会得到令人惊讶的结果:

>>> lst = [1, 1, 2, 3]
>>> for item in lst:
...     if item == 1:
...         lst.remove(item)
... 
>>> print(lst)
[1, 2, 3]

(请注意,输出列表中仍有1

所以 一般规则是你可能不应该做任何在迭代器正在做的事情时添加或删除项目的事情。如果你不知道如何实现迭代器,这是迄今为止最安全的方法。但是,一些迭代器被记录为以特定方式工作。例如以上面的列表示例为例,如果我们反向迭代列表,我们可以删除当前(或更低索引的元素):

>>> lst = [1, 1, 2, 3]
>>> for item in reversed(lst):
...     if item == 1:
...         lst.remove(item)
... 
>>> print(lst)
[2, 3]

这是由于列表迭代器所做的某些保证。请注意,由于我在上面列出的一般规则,我不建议这样做(这可能会导致你的代码阅读器挠头试图弄清楚你为什么要向后迭代它。)

对于列表情况,如果他们计划删除/添加元素,你会看到人们迭代列表的副本,但是在不了解更多关于约束条件的情况下,更难为一般迭代器案例提供建议。问题