1

下面我有一个简单的 XML 结构

<T1>
    <T2>
        <override select="A,B,C">
            <B>Hello</B>
        </override>
        <override select="A">
            <A>Hello</A>
        </override>
    </T2>
</T1>

在此示例中,我尝试删除任何override.
假设我有以下设置代码:

import xml.etree.ElmenentTree as ET
tree = ET.parse(file)
root = tree.getroot()

如果我执行以下操作,则仍然存在:

for parent in root.iter():
    for child in parent:
        if child.tag == 'override':
            parent.remove(child)

但是,如果我指定list(parent)而不是 just in parent,那么它可以工作:

for parent in root.iter():
    for child in list(parent):
        if child.tag == 'override':
            parent.remove(child)

为什么会这样?如果我child在删除之前打印出来,我可以清楚地看到相同的元素以两种方式打印。那么这里到底发生了什么?

4

1 回答 1

1

迭代集合时不得修改集合。Python 2.7 文档没有解释清楚,但Python 3 文档是这样说的:

注意当序列被循环修改时有一个微妙之处(这只会发生在可变序列,即列表中)。内部计数器用于跟踪接下来使用哪个项目,并在每次迭代时递增。当此计数器达到序列的长度时,循环终止。这意味着如果套件从序列中删除当前(或前一个)项目,则将跳过下一个项目(因为它获取已处理的当前项目的索引)。同样,如果套件在当前项目之前插入序列中的项目,则当前项目将在下一次循环中再次被处理。这可能会导致讨厌的错误,可以通过使用整个序列的切片制作临时副本来避免这些错误

于 2014-09-22T22:13:44.377 回答