python字典合并推荐:3.5+用{d1,d2},3.9+优先用|;update()适合就地修改但返回none;三者均不递归合并嵌套字典。

用 {**d1, **d2, **d3} 一次性合并多个字典最直观
如果你的 Python 版本 ≥ 3.5,{**d1, **d2, **d3} 是最贴近“合并语义”的写法:它不改任何原字典、返回新对象、顺序明确(靠右者胜出),还能混入字面量:{**d1, 'override': True, **d2}。
常见错误现象:有人写 {d1, d2} 忘了两个星号,结果报 TypeError: unhashable type: 'dict'——这是集合字面量语法,不是解包。
- 只支持映射类型(
dict或实现了keys()和__getitem__()的对象) - 不能直接解包
None或未定义变量,否则 SyntaxError;需提前过滤:{**(d1 or {}), **(d2 or {})} - 键冲突时覆盖逻辑和
update()一致,但行为更可预测——毕竟没副作用
update() 适合循环聚合或就地更新场景
update() 的本质是“修改状态”,不是“构造结果”。它返回 None,所以 merged = d1.update(d2) 会让 merged 变成 None,这是新手高频翻车点。
适用场景:从多个 API 拉取数据后逐步填充一个结果字典,或配置热更新时复用已有结构。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 必须先
copy()才能保留原字典,多一步就多一个出错机会 - 支持多种输入形式:
d.update({'a': 1}, b=2, [('c', 3)]),但混合使用易读性差 - 若传入非映射类型(如字符串、列表),会抛
TypeError: update() argument must be mapping or iterable
Python 3.9+ 推荐优先用 | 运算符
| 是专为字典合并设计的运算符,语义比解包更干净,性能也略优(大数据量下快 5–10%)。d1 | d2 | d3 比 {**d1, **d2, **d3} 少打四个星号,还天然支持链式。
容易踩的坑:旧版本 Python(≤3.8)直接运行会报 SyntaxError: invalid syntax,CI/CD 流水线里得确认解释器版本。
-
d1 |= d2等价于d1.update(d2),是就地操作,别误以为它也返回新字典 - 左操作数决定键的插入顺序(Python 3.7+ 保证插入序),但右操作数中同名键仍覆盖左操作数
- 不支持与非字典对象做
|,比如d | None会触发TypeError
嵌套字典不会自动递归合并,这点永远要手动处理
无论用 update()、{**d1, **d2} 还是 |,遇到 d1 = {'conf': {'a': 1}} 和 d2 = {'conf': {'b': 2}},结果都是 {'conf': {'b': 2}},不是你想要的 {'conf': {'a': 1, 'b': 2}}。
标准库至今没提供深合并,硬要实现就得自己写递归逻辑,或引入 deepmerge 这类第三方库。自己写时注意两点:判断值是否为 dict 类型、防范循环引用导致栈溢出。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










