python中的字典顺序

时间:2015-12-28 19:50:40

标签: python dictionary

我搜索到的每个地方,他们都说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 个答案:

答案 0 :(得分:12)

它与如何应用散列随机化有关。引用docs(强调我的):

  

默认情况下, str 字节日期时间__hash__()值   对象被“腌制”,具有不可预测的随机值。虽然他们   在单个Python进程中保持不变,它们不是   可以在Python的重复调用之间预测。

对于每次后续运行,您的字符串(代码段1中的键)都使用不同的salt值进行哈希处理 - 因此哈希值也会更改。散列值决定了排序。

对于int类型,哈希函数永远不会改变 - 实际上哈希总是等于整数值。

assert hash(42) == 42

如果散列函数永远不会改变,则后续运行中的排序没有变化。

有关如何实现Python字典的详细信息,请参阅How are Python's Built In Dictionaries Implemented

答案 1 :(得分:0)

不再有用:从Python 3.6开始,标准dict类型默认会保留插入顺序,请参阅Python 3.6文档here的新增功能。

Python 3.7将实现细节提升为语言规范,因此现在dict必须保留Python 3.7+的订单

(通过@Martijn Pieters答案here和Python文档here