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的不同执行之间的顺序不同?
答案 0 :(得分:2)
字典使用hash
函数,的顺序基于密钥的哈希值。
但是,如this Q&A中所述,从python 3.3开始,哈希的种子在执行时被随机选择(更不用说它取决于python版本)。
请注意,从Python 3.3开始,也会使用随机散列种子,使得散列冲突无法预测,以防止某些类型的拒绝服务(攻击者通过引发大规模散列冲突而使Python服务器无响应)。这意味着给定字典的顺序也取决于当前Python调用的随机散列种子。
因此,每次执行程序时,您可能会得到不同的订单。
由于无法保证字典的顺序(不管是在python 3.6之前),这是一个你不应该考虑的实现细节。
答案 1 :(得分:-2)
词典本质上是无序的。期待&#34;命令的任何标准化行为&#34;是不现实的。
保持排序,制作.keys()的有序列表