为什么python词典会改变顺序?

时间:2017-04-23 06:16:55

标签: python dictionary

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}

我一直以为订单是基于密钥的哈希。为什么python的不同执行之间的顺序不同?

2 个答案:

答案 0 :(得分:2)

字典使用hash函数,的顺序基于密钥的哈希值。

但是,如this Q&A中所述,从python 3.3开始,哈希的种子在执行时被随机选择(更不用说它取决于python版本)。

  

请注意,从Python 3.3开始,也会使用随机散列种子,使得散列冲突无法预测,以防止某些类型的拒绝服务(攻击者通过引发大规模散列冲突而使Python服务器无响应)。这意味着给定字典的顺序也取决于当前Python调用的随机散列种子。

因此,每次执行程序时,您可能会得到不同的订单。

由于无法保证字典的顺序(不管是在python 3.6之前),这是一个你不应该考虑的实现细节。

答案 1 :(得分:-2)

词典本质上是无序的。期待&#34;命令的任何标准化行为&#34;是不现实的。

保持排序,制作.keys()的有序列表