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

Python heapq.merge:合并合并结果后,原始合并为空,python,heapq,Python,Heapq,首先,我使用heapq.merge创建了a&b的两个结果,但是在mergeing 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) [

首先,我使用
heapq.merge
创建了a&b的两个结果,但是在
merge
ing 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)
[]
>>> 
a=合并([1,2],[3,4]) >>>b=合并([4,5],[6,7]) >>>名单(a) [1, 2, 3, 4] >>>合并(a、b) >>>名单(a) [] >>>
列表(a)
的最终结果是空的,为什么
合并(a,b)
更改a?

的返回值是一个迭代器。当您将
list
应用于迭代器时,它将被使用。迭代器适用于对值集进行一次遍历。因此,第二次调用
list(a)
时,结果为空。

您的
a
不是一个列表,而是一个迭代器。如果只使用一次,就不能再次使用它进行迭代。这与
合并
无关;您可以在此处看到相同的效果:

>>> a=merge([1,2],[3,4])
>>> list(a)
[1, 2, 3, 4]
>>> list(a)            
[]
正如文档(以及示例中
merge(a,b)
上的输出)所示,
merge
的结果是一个迭代器。迭代器只能使用一次,您不能重置或回放迭代器,即使可以,您的代码也不能这样做。(当然,对于给定的集合,您可以有多个独立的迭代器,至少在集合支持的情况下是如此)

前两个
merge
调用返回生成器,第三个调用使用这些生成器,因此
a
b
之后将耗尽。(事实上,
list(a)
首先消耗
a
,因此在该片段中
merge(a,b)
只会看到
b
的项目,但想法是一样的。)这并不意味着,如果你通过一个列表,它就不会被更改。但是使用迭代器意味着对其进行变异。

>a=heapq.merge([1,2],[3,4])
>>> 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
>>>b=heapq.merge([4,5],[6,7]) >>>名单(a) [1, 2, 3, 4] >>>heapq.合并(a、b) >>>名单(a) [] >>>名单(b) [4,5,6,7]//在使用b的迭代器之前 >>>名单(b) []//在使用b的迭代器之后