字典的插入顺序从Python 3.6开始。它被描述为CPython实现细节,而不是语言特性。文件说明:

dict() now uses a “compact” representation pioneered by PyPy. The memory usage of the new dict() is between 20% and 25% smaller compared to Python 3.5. PEP 468 (Preserving the order of **kwargs in a function.) is implemented by this. The order-preserving aspect of this new implementation is considered an implementation detail and should not be relied upon (this may change in the future, but it is desired to have this new dict implementation in the language for a few releases before changing the language spec to mandate order-preserving semantics for all current and future Python implementations; this also helps preserve backwards-compatibility with older versions of the language where random iteration order is still in effect, e.g. Python 3.5). (Contributed by INADA Naoki in issue 27350. Idea originally suggested by Raymond Hettinger.)

在保持元素顺序的同时,新的字典实现如何比旧的执行得更好?


2017年12月更新:保证字典保留Python 3.7的插入顺序


当前回答

我想补充上面的讨论,但没有声誉评论。

Python 3.8在字典上包含reversed()函数(删除了与OrderedDict的另一个区别)。

Dict和dictview现在可以使用reversed()以反向插入顺序迭代。(由Rémi Lapeyre在bpo-33462中贡献。) 查看python 3.8的新特性

我没有看到OrderedDict提到相等运算符或其他特性,因此它们仍然不完全相同。

其他回答

更新: Guido van Rossum在邮件列表中宣布,从Python 3.7开始,所有Python实现中的字典必须保持插入顺序。

为了在2020年完全回答这个问题,让我引用Python官方文档中的几句话:

在3.7版更改:字典顺序保证为插入顺序。此行为是CPython 3.6版本的实现细节。

在3.7版更改:字典顺序保证为插入顺序。

在3.8版更改:字典现在是可逆的。

字典和字典视图是可逆的。

关于OrderedDict vs Dict的声明:

有序字典就像普通字典一样,但是有一些与排序操作相关的额外功能。现在它们变得不那么重要了,因为内置的dict类获得了记住插入顺序的能力(这个新行为在Python 3.7中得到了保证)。

下面是对第一个问题的回答:

我应该在Python 3.6中使用dict还是OrderedDict ?

我认为文档中的这句话实际上足以回答你的问题

这个新实现的顺序保持方面被认为是一个实现细节,不应该依赖它

dict并不是一个有序的集合,所以如果你想保持一致并且不依赖于新实现的副作用,你应该坚持使用OrderedDict。

让你的代码能够验证未来:)

这里有关于这个问题的争论。

编辑:Python 3.7将保留此功能

在3.7版更改:字典顺序保证为插入顺序。此行为是CPython 3.6版本的实现细节。

我想补充上面的讨论,但没有声誉评论。

Python 3.8在字典上包含reversed()函数(删除了与OrderedDict的另一个区别)。

Dict和dictview现在可以使用reversed()以反向插入顺序迭代。(由Rémi Lapeyre在bpo-33462中贡献。) 查看python 3.8的新特性

我没有看到OrderedDict提到相等运算符或其他特性,因此它们仍然不完全相同。