heapq.merge:合并合并结果后,原始合并为空

时间:2011-09-25 13:42:45

标签: python

首先我创建了一个&的结果。 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)改变了?

4 个答案:

答案 0 :(得分:3)

正如文档(以及示例中merge(a,b)的输出)所示,merge的结果是迭代器。迭代器只能被使用一次,你无法重置或回放它们,即使你可以,你的代码也不会这样做。 (当然,对于给定的集合,您可以拥有多个独立的迭代器,至少在集合支持它时。)

前两个merge调用返回生成器,第三个调用消耗这些生成器,因此ab之后就会耗尽。 (实际上,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)            
[]