2

首先我使用创建了两个结果 a & b heapq.merge,但是在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)
[]
>>> 

的最终结果list(a)是空的,为什么要merge(a,b)改变a?

4

4 回答 4

5

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

前两个merge调用返回生成器,第三个调用消耗这些生成器,因此a之后b被耗尽。(实际上,首先list(a)消费a,所以在那个片段merge(a, b)中只会看到 的项目b,但想法是一样的。)这并不意味着,如果你传递例如一个列表,它就不会改变。但是使用迭代器意味着改变它。

于 2011-09-25T13:57:24.347 回答
2
>>> 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
于 2013-09-06T02:27:45.933 回答
1

a的不是一个列表,而是一个迭代器。如果您使用它一次,则无法再次使用它进行迭代。这与merge; 你在这里看到同样的效果:

>>> a=merge([1,2],[3,4])
>>> list(a)
[1, 2, 3, 4]
>>> list(a)            
[]
于 2011-09-25T13:56:10.353 回答
0

的返回值heapq.merge是一个迭代器。当您应用list到迭代器时,它会被消耗掉。迭代器适用于遍历一组值。所以第二次list(a)调用,结果为空。

于 2011-09-25T13:55:32.027 回答