Python 3.7+ 字典默认按插入顺序迭代,因采用紧凑哈希表结构;dict.keys() 返回视图对象不支持索引,需转列表或用 OrderedDict 实现位置操作;JSON 保序依赖 dict 迭代顺序,但受构造方式影响;3.7 起有序性为语言规范强制要求,非实现细节。

Python 3.7+ 的字典默认按插入顺序迭代,不是因为加了排序逻辑,而是底层哈希表结构被重构成「紧凑哈希表」——它把“查找”和“顺序”拆开了。
为什么 dict.keys()[0] 会报错
字典不是序列类型,没有下标访问能力。即使它有序,d[0] 或 dict.keys()[0] 都会触发 TypeError。
-
dict.keys()返回的是dict_keys视图对象,不支持索引 -
list(d.keys())[0]能取第一个键,但会强制构建完整列表,时间复杂度 O(n),热路径中应避免 - 真要按位置操作(比如取首/尾、移动顺序),该用
collections.OrderedDict,它提供popitem(last=False)和move_to_end()
JSON 序列化保序的真正前提
json.dumps() 输出顺序完全依赖 dict 的迭代顺序,但它不保证“代码书写顺序”一定等于输出顺序——关键看字典怎么构建的。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 直接写
{'a': 1, 'b': 2}:CPython 3.7+ 解析器按书写顺序插入,没问题 - 用解包构造
{**d1, **d2}:顺序由d1和d2的插入顺序拼接,不是语法顺序 - 从 JSON 反序列化再 dump 回去:
json.loads()在 3.7+ 返回有序dict,能保序;但若中间调用d.update(...)或重复赋值同名键,顺序可能被覆盖 -
json.dumps(..., sort_keys=True)会强制按键字母序重排,跟插入顺序无关
3.6 和 3.7 的本质区别在哪
Python 3.6 的有序是 CPython 实现细节,不可移植;3.7 起才是语言规范强制要求,所有合规实现(PyPy、Jython)都必须满足。
立即学习“Python免费学习笔记(深入)”;
- 在 3.6 中,
for k in d:看似总按插入顺序输出,但换到 PyPy 或旧版 CPython 补丁环境,行为可能不一致 - 3.7+ 的有序性写入 PEP 558,是你可以写进单元测试并依赖的行为
- 别为“保险”而默认用
OrderedDict——它额外维护链表,内存开销更大;普通dict在 3.7+ 已足够
最容易被忽略的一点:有序是「插入顺序」,不是「定义顺序」或「键大小顺序」。如果逻辑里隐含了「字典按键自动排序」的假设,比如拿 dict.keys() 当 sorted(keys) 用,运行时就会出错。

















