为什么 ElementTree.Element.remove() 方法在直接迭代时不能正常工作?

Why ElementTree.Element.remove() method is not working correctly with direct iteration?

我正在使用 Python xml.etree.ElementTree 编辑 XML 文件。 这是简单的文件示例:

<root>
  <sub1>1</sub1>
  <sub2>2</sub2>
</root>

我想删除所有根子元素。当我使用

...
for child in root:
  root.remove(child)
...

'remove' 方法仅删除第一个子元素。但是

...
for child in root.getchildren():
  root.remove(child)
...

它适用于所有子元素。为什么会这样?它是一些迭代器功能,还是我需要了解更多关于 'remove' 方法的信息?

是的,如果你使用for child in root:它就是一个迭代器 并且不建议使用迭代器方法从其容器中删除项目。您应该为循环生成一个列表。

在您的第一个删除操作(使用迭代器)中,它实际上删除了所有奇数子元素(索引 0、2、4、..)并将所有偶数子元素留在您的根元素中。 您可以使用一个简单的列表尝试该行为:

l = [1,2,3,4,5,6]
for x in l:
    l.remove(x)
print (l)

输出

[2, 4, 6]

您可以通过添加 <sub3> 元素在您的 XML 中尝试,并观察类似的结果。

根据此处的 official changeloggetchildren 方法已被弃用。

建议使用:

for child in list(root):
    # do something