无论我在哪里搜索,他们都说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
Łukasz Rogal.. 12
它与如何应用散列随机化有关.引用文档(强调我的):
缺省情况下,
__hash__()
值STR,字节和日期时间 对象被"盐析"与不可预测的随机值.虽然它们在单个Python进程中保持不变,但是在重复调用Python之间它们是不可预测的.
对于每次后续运行,您的字符串(代码段1中的键)都使用不同的salt值进行哈希处理 - 因此哈希值也会更改.哈希值确定排序.
对于int
类型,哈希函数永远不会改变 - 实际上哈希总是等于整数值.
assert hash(42) == 42
如果散列函数永远不会更改,则后续运行中的排序不会发生变化.
有关如何实现Python字典的详细信息,您可以参考如何实现Python的内置字典.
它与如何应用散列随机化有关.引用文档(强调我的):
缺省情况下,
__hash__()
值STR,字节和日期时间 对象被"盐析"与不可预测的随机值.虽然它们在单个Python进程中保持不变,但是在重复调用Python之间它们是不可预测的.
对于每次后续运行,您的字符串(代码段1中的键)都使用不同的salt值进行哈希处理 - 因此哈希值也会更改.哈希值确定排序.
对于int
类型,哈希函数永远不会改变 - 实际上哈希总是等于整数值.
assert hash(42) == 42
如果散列函数永远不会更改,则后续运行中的排序不会发生变化.
有关如何实现Python字典的详细信息,您可以参考如何实现Python的内置字典.