当前位置:首页>python>[程序员] python2到python3行为改变,dictionary相关

[程序员] python2到python3行为改变,dictionary相关

  • 2026-09-08 12:00:35
[程序员] python2到python3行为改变,dictionary相关
说起行为改变,比如:
[程序员] glibc行为改变:32位程序malloc相关
[程序员] Linux kernel行为改变,crashkernel相关
之前还遇到过很多来,比如今天说的python2到python3的升级。虽然dictionary的使用没有太多的改变,但内部的实现有更大的变动。上层应用如果默认依赖python2上的实现方式,就有可能在python3的时候出现问题。

这个差别是:字典插入顺序。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 等)。

最新文章

随机文章