Python 3.7+ 的 dict 默认保持插入顺序,是语言规范;OrderedDict 仍适用于顺序敏感比较、移动键位置和弹出特定位置项等场景。

Python 3.7+ 的内置 dict 默认保持插入顺序,无需额外处理即可按插入顺序遍历;而 Python 3.6(仅限 CPython 实现)和更早版本中,需使用 collections.OrderedDict 才能保证顺序。
Python 3.7+:普通 dict 就够用
从 Python 3.7 开始,dict 的插入顺序保留是语言规范的一部分(不再是 CPython 的实现细节),所有符合标准的 Python 解释器都必须支持。这意味着:
-
for k in d:、d.keys()、d.values()、d.items()都按插入顺序返回 - 删除再重新插入同一 key 会将其放到末尾(行为与
OrderedDict.move_to_end()类似) - 不需要导入任何模块,开箱即用
OrderedDict 的独特用途(即使在 3.7+ 中)
OrderedDict 并未过时,它在以下场景仍有不可替代性:
-
顺序敏感的相等判断:两个
OrderedDict只有键值对完全相同 且顺序一致 才判为相等;普通dict只看内容,不看顺序 -
移动键位置:支持
.move_to_end(key, last=True),可把某个 key 移到开头或结尾 -
弹出特定位置的项:支持
.popitem(last=True)弹出末尾/开头项;普通dict.popitem()在 3.7+ 也支持last参数,但OrderedDict更早提供该能力
兼容旧版本(如 3.6 或 2.7)怎么办?
若需支持 Python OrderedDict:
立即学习“Python免费学习笔记(深入)”;
from collections import OrderedDictd = OrderedDict() d['first'] = 1 d['second'] = 2 d['third'] = 3
遍历时一定按 first → second → third
注意:不要用 OrderedDict(dict(...)) 构造,因为传入的普通 dict 在旧版本中本身无序,会丢失原始顺序。应逐个插入,或用 OrderedDict([('a',1), ('b',2)]) 这种序列方式初始化。
一个小陷阱:字面量 vs 动态插入
在 Python 3.7+ 中,字典字面量 {'a':1, 'b':2} 的顺序就是书写顺序,但要注意:
- 如果键名是变量或表达式,实际插入顺序仍由运行时求值顺序决定,不是源码书写顺序
- 重复 key 会被覆盖,最后赋值的生效,位置以最后一次插入为准










