elementtree 列表的长度在第二次调用后变为 0

lenght of a list of elementtree turn 0 after second call

我有这样的代码

import xml.etree.ElementTree as etree
tree = etree.fromstring("<all_products><product instrument_name='nice_instrument'></product></all_products>")
product_iter = tree.iterfind("product[@instrument_name='nice_instrument']")
len(list(product_iter))

这给了我预期的 product_iter 1 列表的 len。

但是如果再次调用 len(list(product_iter)) 我得到 0。

我不明白为什么会这样。有人可以解释为什么 product_iter 变量在将 len 调用到列表时会以某种方式改变吗?

查看 elementtree 的文档https://docs.python.org/2/library/xml.etree.elementtree.html我没有看到任何信息如何解释这个。

问候 Trygve

product_iter 是迭代器,不是列表。如果将其转换为列表,len 将保持 1:

>>> import xml.etree.ElementTree as etree
>>> tree = etree.fromstring("<all_products><product instrument_name='nice_instrument'></product></all_products>")
>>> product_iter = tree.iterfind("product[@instrument_name='nice_instrument']")
>>> products = list(product_iter)
>>> len(products)
1
>>> len(products)
1

我认为这里的底线是理解 python 中的迭代器。

在这种情况下,也许 findall 而不是 iterfind 更好。