首先我创建了一个&的结果。 b通过使用合并,但在合并a&b之后,我发现a的列表是空的。
>>> a=merge([1,2],[3,4])
>>> b=merge([4,5],[6,7])
>>> list(a)
[1, 2, 3, 4]
>>> merge(a,b)
<generator object merge at 0x365c370>
>>> list(a)
[]
>>>
list(a)的最后一个命令是空的,为什么merge(a,b)改变了?
答案 0 :(得分:3)
正如文档(以及示例中merge(a,b)
的输出)所示,merge
的结果是迭代器。迭代器只能被使用一次,你无法重置或回放它们,即使你可以,你的代码也不会这样做。 (当然,对于给定的集合,您可以拥有多个独立的迭代器,至少在集合支持它时。)
前两个merge
调用返回生成器,第三个调用消耗这些生成器,因此a
和b
之后就会耗尽。 (实际上,list(a)
首先使用a
,因此在该代码段merge(a, b)
中只会看到b
的项目,但这个想法是相同的。)它不会< em>意为,如果你通过例如列表不会被更改。但是使用迭代器意味着改变它。
答案 1 :(得分:1)
>>> a=heapq.merge([1,2],[3,4])
>>> b = heapq.merge([4,5], [6,7])
>>> list(a)
[1, 2, 3, 4]
>>> heapq.merge(a,b)
<generator object merge at 0x7f083da50f50>
>>> list(a)
[]
>>> list(b)
[4, 5, 6, 7] // before you consume the iterator of b
>>> list(b)
[] // after you consume the iterator of b
答案 2 :(得分:0)
heapq.merge
的返回值是迭代器。将list
应用于迭代器时,它将被使用。迭代器适用于一组值的一次传递。因此,第二次调用list(a)
时,结果为空。
答案 3 :(得分:0)
你a
不是列表而是迭代器。如果您曾经使用过它,则无法再次使用它。这与merge
无关;你在这里看到同样的效果:
>>> a=merge([1,2],[3,4])
>>> list(a)
[1, 2, 3, 4]
>>> list(a)
[]