当前位置:  开发笔记 > 编程语言 > 正文

为什么Python 3.3+ dict排序不仅是未定义的,而且是变量的?

如何解决《为什么Python3.3+dict排序不仅是未定义的,而且是变量的?》经验,为你挑选了1个好方法。

我出于好奇而问这个问题(具体来说,深入了解python是如何工作的).

我完全知道python dict对象是无序的 - 你可以放入一堆项目,并打印出一些表示dict,并且表示中项目的顺序将与输入项目的顺序无关.

然而,令我好奇的是,为什么顺序从一次执行代码变为另一次?

我有一个非常简单的python脚本,正在打印dict到控制台.字典看起来像这样(内容非常相关):

{
    'hello': 'hi',
    'goodbye': 'bye',
    'hahaha': 'lol',
}

将其打印到控制台会导致项目不仅以随机顺序打印,而且每次运行程序时都以不同的顺序打印.这是我的问题:为什么会这样?

注意:python代码在django项目中(但在这种情况下我没有使用任何django功能 - 只是提到它以防它以某种方式相关).



1> Riccati..:

这里有一个注释: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中更改:默认情况下启用哈希随机化.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有