如果多次执行以下代码,则会产生不一致的结果。我用Python-3.5.1在debian8.4(jessie)上运行它。在
from heapq import nlargest
from operator import itemgetter
dd = dict([('41', 768.0), ('2', 15275.0), ('9', 1728.0), ('90', 1728.0),
('97', 1200.0), ('68', 2904.0), ('98', 4380.0), ('16', 768.0),
('37', 768.0), ('17', 1587.0), ('25', 4495.4)])
print(nlargest(5, dd.items(), key=itemgetter(1)))
多次执行后的输出:
^{pr2}$看起来很随机,有人能解释一下为什么会这样吗?在
如果将dd.items()
替换为sorted(dd.items())
,则输出将变为确定性。i、 e
我还用python-2.7在OSX和CentOS6.7上尝试了上面的代码,它总是返回
^{3}$这是Python3heapq
实现中的一个bug吗?在
你要的是最大的5件商品,第5位有一个平局。Python如何打破这种联系是任意的,任何涉及到的不确定性行为都不是一个bug。在
它不确定的原因是因为dict迭代顺序是任意的,而且自从python3.3以来,字符串和某些其他类型的散列随机化在默认情况下是启用的。因此,
heapq.nlargest
接收dict项的顺序有一个随机成分,它打破联系的方式取决于它看到项目的顺序。在相关问题 更多 >
编程相关推荐