【问题标题】:Why is Python 3.3+ dict ordering not only undefined, but variable? [duplicate]为什么 Python 3.3+ dict 的排序不仅是未定义的,而且是可变的? [复制]
【发布时间】:2015-12-10 18:57:26
【问题描述】:

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

我完全知道pythondict对象是无序的——你可以放入一堆项目,并打印出dict的一些表示,表示中项目的排序将没有对应关系按照输入项目的顺序。

然而,我很好奇的是,为什么顺序会从一次执行代码更改为下一次执行?

我有一个非常简单的 python 脚本,可以将dict 打印到控制台。 dict 看起来像这样(内容无关紧要):

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

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

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

【问题讨论】:

  • Python 2 还是 Python 3?您可能遇到了哈希随机化,在这种情况下,this 将是一个合适的欺骗目标。
  • 这在 python2 中不会发生。
  • Python 3?您的意思是“操作系统(Windows、Linux/MacOS、Android、iOS...)和/或实现(CPython/PyPi)之间的变量”吗?这是一个很好的问题,但请补充细节!
  • @sudomakeinstall2 - 如果您愿意,可以通过设置环境变量 export PYTHONHASHSEED=random 在 python 2.7 中启用它。
  • @tdelaney:有没有更多的 Pythonic 方式/包来获得 Python 2.x 中的向后兼容性?

标签: python django


【解决方案1】:

这里有一个说明:https://docs.python.org/3/reference/datamodel.html#object.__hash__

这里是注释:

注意:默认情况下,str、bytes 和 datetime 对象的 __hash__() 值是用不可预测的随机值“加盐”的。尽管它们在单个 Python 进程中保持不变,但它们在 Python 的重复调用之间是不可预测的。 这是为了防止由精心选择的输入引起的拒绝服务,这些输入利用 dict 插入的最坏情况性能,O(n^2) 复杂度。有关详细信息,请参阅http://www.ocert.org/advisories/ocert-2011-003.html。 更改哈希值会影响 dicts、sets 和其他映射的迭代顺序。 Python 从未对这种顺序做出保证(它通常在 32 位和 64 位版本之间变化)。

另见PYTHONHASHSEED

3.3 版更改:默认启用哈希随机化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2018-02-16
    • 2023-03-29
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多