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