2 回答

TA贡献1765条经验 获得超5个赞
简短的回答
字典被实现为哈希表而不是堆栈。
没有倾向于打乱密钥顺序的额外措施
哈希表
在 Python 3.6 之前,字典中的排序是由散列函数随机化的。大致来说,它是这样工作的:
d = {} # Make a new dictionary
# Internally 8 buckets are formed:
# [ [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] ]
d['a'] = 10 # hash('a') % s gives perhaps bucket 5:
# [ [ ] [ ] [ ] [ ] [ ] [('a', 10)] [ ] [ ] ]
d['b'] = 20 # hash('b') % s gives perhaps bucket 2:
# [ [ ] [ ] [('b', 20)] [ ] [ ] [('a', 10)] [ ] [ ] ]
因此,您可以看到此 dict 的排序会放在'b'
前面,'a'
因为哈希函数放在 'b'
较早的存储桶中。
记住插入顺序的较新的哈希表
从 Python 3.6 开始,还添加了一个堆栈。请参阅此概念验证,以更好地了解其工作原理。
因此,dicts 开始记住插入顺序,并且这种行为在 Python 3.7 及更高版本中得到保证。
在较旧的 Python 实现上使用 OrderedDict
在 3.7 之前,您可以使用collections.OrderedDict()来获得相同的效果。
更深的潜水
对于那些有兴趣了解更多关于它是如何工作的人,我有一个37 分钟的视频,它从第一原理展示了用于制作现代 Python 字典的所有技术。

TA贡献1876条经验 获得超6个赞
在 Python 3.6 之前,字典没有排序(有关更多信息,请参阅此stackoverflow 线程)。如果您使用的是 Python 3.6 或更低版本(在 CPython 3.6 中,维护顺序的事实是一个实现细节,但在 Python 3.7 中它成为了一种语言特性),您可以使用OrderedDict来获得您想要的行为。
例如,您可以将代码片段的开头更改为以下内容:
from collections import OrderedDict
repetitions = OrderedDict()
...
添加回答
举报