Python 3 中字典键的非确定性排序
在 Python 2 中,字典键的顺序是一致的,但不能保证。然而,在 Python 3 中,从 vars() 等函数获取的字典键的顺序似乎是不确定的。
非确定性的原因
此更改是归因于 Python 3.3 中实施的安全修复。为了防止哈希值可预测,在哈希计算中使用随机种子。这种随机化会导致字典键的顺序不可预测。
在 Python 3.6 及更高版本中保留顺序
在 Python 3.6 中,引入了一种新的字典实现,它保留了默认插入顺序。从 Python 3.7 开始,Python 语言规范保证了此行为。
反转非确定性
要禁用哈希随机化并恢复到以前的行为,请设置PYTHONHASHSEED 环境变量设置为 0。但是,请注意,出于安全原因,不建议这样做。
异常:设置键
与字典不同,Python 中的集合始终维护插入顺序,无论 Python 版本如何。
示例:一致的字典键排序
虽然字典键在 Python 3.3 中是不确定的,但使用集合将字典键转换为字符串保留顺序。例如:
<code class="python">set([str(i): i for i in range(10)].keys())</code>
这将始终返回列表 ['0', '1', '2', '3', '4', '5', '6', '7' , '8', '9'].
其他信息
有关哈希随机化的更多详细信息,请参阅 object.__hash__() 文档。
以上是为什么 Python 3 字典键排序是非确定性的?的详细内容。更多信息请关注PHP中文网其他相关文章!