最推荐字典合并方式是字典解包({d1, d2})或 | 运算符(python 3.9+),二者均生成新字典、不修改原字典,而 update() 是就地修改且返回 none;解包兼容 python 3.5+,| 更现代语义清晰;均为浅合并,嵌套字典需手动实现深度合并。

Python字典合并最常用、最推荐的方式是使用字典解包({**dict1, **dict2})或 | 运算符(Python 3.9+),而非 update()。关键区别在于:解包和 | 生成新字典,不修改原字典;update() 是就地修改,返回 None,且语义更偏向“更新状态”而非“构造新结果”。
解包方式({**d1, **d2})——简洁、不可变、兼容老版本
适用于 Python 3.5+,语法直观,天然支持链式合并(如 {**d1, **d2, **d3})。后出现的键会覆盖前面的同名键,符合“右优先”逻辑。
- 不会改动原始字典,适合函数式风格或需要保留原数据的场景
- 可混合常量键值对:
{**d1, 'new_key': 'value', **d2} - 注意:仅支持映射类型(dict 或类似
Mapping的对象),不支持任意可迭代对象
| 运算符(Python 3.9+)——最现代、最清晰的合并方式
专为字典合并设计:d1 | d2 返回新字典,d1 |= d2 等价于 d1.update(d2)(就地修改)。
- 语义明确:“|” 表示“并集式合并”,比解包更贴近数学直觉
- 支持链式:
d1 | d2 | d3,且性能略优于多次解包 - 左操作数决定键顺序(Python 3.7+ 插入序保证),右操作数中同名键覆盖左操作数
update() ——适合就地更新,慎用于“合并表达式”
dict.update() 修改调用者本身,返回 None,因此不能直接用于赋值或链式表达:
立即学习“Python免费学习笔记(深入)”;
- ❌ 错误写法:
merged = d1.update(d2)→merged是None - ✅ 正确用法:
d1.update(d2)(仅当真想修改d1时) - 若需新字典,必须先复制:
merged = d1.copy(); merged.update(d2),比解包或|多两步,易出错
特殊情况处理:嵌套字典与深度合并
上述方法均为浅合并(shallow merge),嵌套字典会被整体替换,而非递归合并。如需深度合并,需自行实现或借助第三方库(如 deepmerge):
- 例如:
d1 = {'a': {'x': 1}}; d2 = {'a': {'y': 2}},用{**d1, **d2}得到{'a': {'y': 2}},不是{'a': {'x': 1, 'y': 2}} - 没有内置深度合并语法,不要误以为解包或
|能自动递归









