这个差别是:字典插入顺序。python2,字典不保证任何顺序,也就是“无序”。python 3.7+,字典保证按插入顺序迭代,是有语言规范保证。
python2的行为,字典基于哈希表实现,迭代顺序未定义,通常和插入顺序不一致:
d = {}d['a'] = 1d['b'] = 2d['c'] = 3print d.keys()# 可能是 ['a', 'c', 'b'] 等任意顺序
没有 dict.keys() 返回“插入顺序”的承诺。
从python 3.7开始,有了语言规范保证插入顺序:字典会保持插入顺序。对键的迭代顺序与插入顺序一致。dict的迭代、.keys()、.values()、.items() 都按插入顺序。
删除再插入会改变“当前顺序”(删除后该键消失,再插入会到末尾)。
d = {}d['a'] = 1d['b'] = 2d['c'] = 3print(list(d.keys()))# 保证是 ['a', 'b', 'c']d['a'] = 10# 更新不改变键的位置print(list(d.keys()))# 仍是 ['a', 'b', 'c']del d['b']d['b'] = 20# 重新插入的 'b' 会排在最后print(list(d.keys()))# ['a', 'c', 'b']
写兼容/可移植代码时的建议,若需要“有序字典”且要兼容 Python 2 或早于 3.7 的 Python 3:使用 collections.OrderedDict,它在 2.7 和 3.x 中都保证插入顺序。
若只跑 Python 3.7+:内置 dict 已经保证插入顺序,很多场景下可以不再用 OrderedDict(除非你需要 OrderedDict 特有的行为,比如“最后插入”语义、move_to_end 等)。