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的不同执行顺序不同?
词典的使用hash
函数和顺序is基于密钥的哈希值。
但是,正如某处所述本次问答,从python 3.3开始,哈希的种子是在执行时随机选择的(更不用说这取决于python版本)。
请注意,从 Python 3.3 开始,还使用随机哈希种子,使哈希冲突变得不可预测,以防止某些类型的拒绝服务(攻击者通过引起大量哈希冲突使 Python 服务器无响应)。这意味着给定字典的顺序也取决于当前 Python 调用的随机哈希种子。
因此,每次执行程序时,您可能会得到不同的顺序。
由于无法保证字典的顺序(无论如何在 python 3.6 之前都不会),因此这是您不应该考虑的实现细节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)