最常用且优雅的方式是字典解包(**),生成新字典并按从左到右顺序覆盖同名键;chainmap则提供动态视图,不复制数据、实时反映修改,适用于配置作用域链等场景。

Python 合并多个字典,最常用也最优雅的方式是使用字典解包(**),它简洁、直观、符合 Python 习惯;而 collections.ChainMap 适用于需要“逻辑叠加”而非“物理合并”的场景——它不创建新字典,只是按顺序查找键,且对原字典的修改实时可见。
字典解包:生成新字典,覆盖优先级从左到右
用 {**d1, **d2, **d3} 可一次性合并多个字典。靠右的字典中同名键会覆盖靠左的值,顺序即优先级。
- 适合一次性构造最终配置、函数参数组装、API 请求数据拼接等场景
- 所有输入必须是映射类型(如
dict、MappingProxyType),否则报TypeError - 不支持嵌套自动合并(即不会递归合并子字典),纯浅层覆盖
- 示例:{**{'a': 1, 'b': 2}, **{'b': 3, 'c': 4}} → {'a': 1, 'b': 3, 'c': 4}
ChainMap:动态视图,查键时按顺序回溯
ChainMap(d1, d2, d3) 创建一个只读(默认)的链式查找结构,访问键时依次在各字典中搜索,返回第一个匹配值。
- 不复制数据,内存友好;修改任一底层字典,
ChainMap立即反映变化 - 支持
.new_child()和.parents实现作用域嵌套(如局部/全局配置隔离) - 不能直接用作普通字典(比如 JSON 序列化会失败),需调用
dict(cm)转为实际字典(此时才真正合并,行为类似解包) - 注意:
ChainMap的keys()/values()不去重,重复键可能多次出现
其他实用方式对比
除了主流两种,还有几种补充方案,适用不同约束:
立即学习“Python免费学习笔记(深入)”;
- 字典 update() 链式调用:适合逐步累积,但需新建空字典再逐个更新,不够紧凑 —— d = {}; [d.update(x) for x in [d1,d2,d3]]
-
Union(Python 3.9+):
d1 | d2 | d3,语义与解包一致,右操作数优先;支持就地更新d1 |= d2 - 第三方库(如 deepmerge):仅当需要深度合并嵌套字典时考虑,标准库不提供该能力
选哪个?看目的
要一份独立、稳定、可序列化的合并结果 → 用字典解包或 | 操作符。
要多层配置动态生效、避免拷贝、模拟作用域链 → 用 ChainMap。
别为了“看起来高级”而误用 ChainMap 去替代本该生成新字典的场景。










