Python 3.6+版本中的字典是按插入顺序排序[1]。
对于Python的CPython实现,从Python 3.6开始,字典会记住插入的顺序。然而,在Python 3.6中,这被认为是一个实现细节;如果你想要在其他Python实现中(以及其它有序行为[1])保证插入顺序,你需要使用OrderedDict
。
从Python 3.7开始,这是一项保证的语言特性,不再仅仅是一个实现细节。GvR在python-dev邮件中的声明:
让它变成现实吧。“字典保持插入顺序”就是规则。谢谢!
这意味着你可以依赖这一点。如果其他Python实现希望成为Python 3.7的符合实现,它们也必须提供一个插入顺序的字典。
For example, the dictionary:
d = {'timmy': 'red', 'barry': 'green', 'guido': 'blue'}
is currently stored as [keyhash, key, value]:
entries = [['--', '--', '--'],
[-8522787127447073495, 'barry', 'green'],
['--', '--', '--'],
['--', '--', '--'],
['--', '--', '--'],
[-9092791511155847987, 'timmy', 'red'],
['--', '--', '--'],
[-6480567542315338377, 'guido', 'blue']]
Instead, the data should be organized as follows:
indices = [None, 1, None, None, None, 0, None, 2]
entries = [[-9092791511155847987, 'timmy', 'red'],
[-8522787127447073495, 'barry', 'green'],
[-6480567542315338377, 'guido', 'blue']]
[1]: 我使用“插入顺序”而不是“有序”,因为存在OrderedDict,使用“有序”会暗示`dict`对象提供了进一步的行为,但实际上没有。OrderedDict是可逆的,提供了顺序敏感的方法,主要提供了顺序敏感的相等测试(`==`, `!=`)。目前,`dict`不提供任何这些行为/方法。
**kwargs
保留顺序特性的PEP时提出的问题,因此所使用的措辞是委婉的:函数签名中的**kwargs
现在保证是一个保留插入顺序的“映射”。他们使用了术语“映射”,以避免强制其他实现使字典有序(并在内部使用OrderedDict),并作为一种信号表明这不应该依赖于字典没有排序这一事实。 - Dimitris Fasarakis Hilliard