Python中的字典序排序

5

我在各处搜索时,人们都说Python字典没有任何顺序。 当我运行代码1时,每次输出的结果都不同(随机顺序)。但是当我运行代码2时,它总是显示相同的排序输出。为什么第二个片段中的字典是有序的?

   #code 1

    d = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
    for a, b in d.items():
        print(a, b)
   #code 2 

    d = {1: 10, 2: 20, 3: 30, 4: 40}
    for a, b in d.items():
        print(a, b)

输出

代码1:

four 4
two 2
three 3
one 1

再次展示代码1:

three 3
one 1
two 2
four 4

代码 2(始终):

1 10
2 20
3 30
4 40
2个回答

13

这与哈希随机化的应用有关。引用文档(重点在于我的强调):

默认情况下,strbytesdatetime对象的__hash __()值会被一个不可预测的随机值“盐”处理。尽管它们在单个Python进程内保持不变,但在重复调用Python时是不可预测的。

对于每次后续运行,您的字符串(片段1中的键)将使用不同的盐值进行哈希处理,因此哈希值也会发生更改。哈希值确定排序顺序。

对于int类型,哈希函数永远不会更改-实际上哈希始终等于整数值。

assert hash(42) == 42

如果哈希函数不变,那么在后续运行中排序就不会有改变。

有关Python字典实现的详细信息,请参阅Python内置字典是如何实现的


6
哈希并不总是对整数起作用。-1 的哈希值是 -2,而非常大的整数也需要降低其哈希值,例如 hash(10**20) - wim

0

从Python 3.6开始,标准的dict类型默认按插入顺序维护,详见Python 3.6文档这里

Python 3.7将此实现细节提升为语言规范,因此在Python 3.7+中强制要求dict保留顺序。

(参考 @Martijn Pieters 的回答这里和Python文档这里)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接