我正在玩heapq模块,并且遇到了尴尬的行为,尽管我只使用修改它的内置函数。我创建了一个示例来显示行为。我的Python版本是3.5.1+。在样本中,我期望最终输出中有6个元素,但不知何故它会丢失其中的3个元素。
from heapq import *
h = []
heappush(h, 1000000000)
heappush(h, 100000000)
heappush(h, 10000000)
heappush(h, 1000000)
heappush(h, 100000)
heappush(h, 10000)
print(h)
print(len(h))
sorted = [heappop(h) for x in h]
print(sorted)
控制台上的输出:
$ python3 heapq_sample.py
[10000, 1000000, 100000, 1000000000, 10000000, 100000000]
6
[10000, 100000, 1000000]
任何人都可以识别问题或解释行为吗?
答案 0 :(得分:1)
我现在自己想出了问题,想要解释一下。该问题与heapq模块无关,而是在迭代时修改列表。使用heappop函数,我们从列表中删除第一个元素并返回它。我在列表中显示了它的影响,并将迭代中的当前元素标记为粗体:
迭代1:
[ 10000 ,1000000,100000,1000000000,10000000,100000000]
迭代2
[1000000, 100000 ,1000000000,10000000,1000000]
迭代3
[1000000,1000000000, 10000000 ,100000000]
在迭代3中弹出另一个元素,并且python想要在“迭代4”中跳转到列表中的第4个元素,这个元素不再被给出,这就是为什么它会引发StopIteration。