为什么Python字典会改变顺序?

4

在Python3.5中,字典中存储的对象顺序会随着解释器不同的执行而改变,但对于同一个解释器实例来说,它似乎保持不变。

$ python3 <(printf 'print({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})')
{'b': 2, 'a': 1}
{'b': 2, 'a': 1}
{'b': 2, 'a': 1}
{'b': 2, 'a': 1}
$ python3 <(printf 'print({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})\nprint({"a": 1, "b": 2})')
{'a': 1, 'b': 2}
{'a': 1, 'b': 2}
{'a': 1, 'b': 2}
{'a': 1, 'b': 2}

我一直以为顺序是基于key的哈希值,那么为什么不同的python执行结果中顺序是不同的呢?


这个问题的答案似乎被作为旁注埋在那里的被接受的答案中,但我认为这些问题并不是在问同一件事情。 - Tobin
是的,也许你是对的。所以我正在恢复我的先前回答。 - Jean-François Fabre
2个回答

2
字典使用哈希函数,并且顺序是基于键的哈希值。但是,正如在这个Q&A中所述,从python 3.3开始,哈希的种子在执行时被随机选择(更不用说它取决于Python版本)。
引用: 请注意,自Python 3.3起,还使用随机哈希种子,使哈希冲突不可预测,以防止某些类型的拒绝服务(攻击者通过引起大量哈希冲突来使Python服务器无响应)。这意味着给定字典的顺序也取决于当前Python调用的随机哈希种子。 因此,每次执行程序时,您可能会得到不同的顺序。 由于字典的顺序不能保证(至少在python 3.6之前),因此这是一个您不应该考虑的实现细节。

-2
字典本质上是无序的。期待任何标准化的“顺序”行为都是不现实的。
要保持顺序,可以使用一个有序列表来列出键(.keys())。

那不是问题。 - Jean-François Fabre
此外,您需要使用collections模块中的OrderedDict。 - sawyermclane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接