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

2024-06-26 13:42:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

假设我这样做:

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

这会破坏el迭代器吗?在


Tags: 模块infor规则mylibraryrootxml
1条回答
网友
1楼 · 发布于 2024-06-26 13:42:07

在很多情况下,在迭代iterable时修改它会导致问题。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)。在

因此,一般的规则是,当迭代器正在执行时,您可能不应该做任何添加或删除项的操作。如果您不知道迭代器是如何实现的,这是迄今为止最安全的方法。但是,有些迭代器是以特定的方式工作的。e、 g.以上面的列表为例,如果我们反向迭代列表,我们发现可以移除当前的(或索引较低的元素):

^{pr2}$

这是由于列表迭代器所做的某些保证造成的。请注意,由于我上面列出的一般规则,我不建议这样做(这可能会导致您的代码阅读者绞尽脑汁,试图找出您为什么要反向迭代它)。在

对于列表的情况,如果计划删除/添加元素,您会看到人们在列表的副本上迭代,但是如果不了解问题的约束,就很难对一般迭代器的情况给出建议。在

相关问题 更多 >