我出于好奇而问这个问题(具体来说,深入了解python是如何工作的).
我完全知道python dict
对象是无序的 - 你可以放入一堆项目,并打印出一些表示dict
,并且表示中项目的顺序将与输入项目的顺序无关.
然而,令我好奇的是,为什么顺序从一次执行代码变为另一次?
我有一个非常简单的python脚本,正在打印dict
到控制台.字典看起来像这样(内容非常相关):
{ 'hello': 'hi', 'goodbye': 'bye', 'hahaha': 'lol', }
将其打印到控制台会导致项目不仅以随机顺序打印,而且每次运行程序时都以不同的顺序打印.这是我的问题:为什么会这样?
注意:python代码在django项目中(但在这种情况下我没有使用任何django功能 - 只是提到它以防它以某种方式相关).
这里有一个注释:https://docs.python.org/3/reference/datamodel.html#object.__hash__
这是笔记:
注意:默认情况下,
__hash__()
str,bytes和datetime对象的值是"salted"的,具有不可预测的随机值.虽然它们在单个Python进程中保持不变,但是在重复调用Python之间它们是不可预测的.这旨在提供针对由精心选择的输入引起的拒绝服务的保护,该输入利用dict插入的最坏情况性能,O(n ^ 2)复杂度.有关详细信息,请参见http://www.ocert.org/advisories/ocert-2011-003.html.更改哈希值会影响dicts,集和其他映射的迭代顺序.Python从未对此排序做出保证(通常在32位和64位版本之间有所不同).另见
PYTHONHASHSEED
.在版本3.3中更改:默认情况下启用哈希随机化.