下面我有一个简单的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
在删除之前先打印出来,则可以清楚地看到以两种方式打印相同的元素。那么,这里到底发生了什么?
在迭代集合时,一定不要修改它。Python 2.7文档没有明确解释,但这是Python 3文档说的:
注意循环修改序列时有一个微妙之处(这仅适用于可变序列,即列表)。内部计数器用于跟踪下一个要使用的项目,并且每次迭代时都会递增。当该计数器达到序列的长度时,循环终止。这意味着,如果套件从序列中删除当前(或上一个)项目,则下一个项目将被跳过(因为它获取已被处理的当前项目的索引)。同样,如果套件在当前项目之前按顺序插入一个项目,则下次通过循环再次处理当前项目。这可能导致讨厌的错误,可以通过使用整个序列的一部分进行临时复制来避免这些错误
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句