展开运算符()仅支持单层字典解包,不处理嵌套字典;适用于合并扁平字典,重复键以右侧值覆盖;含嵌套时需自定义递归函数或混合策略,不可用sum()或+操作。

展开运算符(**)本身不处理嵌套结构,它只在字典层面做一层解包。所谓“嵌套深度为一”,指的是目标对象是字典,且其值可能是任意类型(包括列表、字符串、数字等),但**没有第二层字典嵌套**。这时用 ** 合并多个字典是高效且直接的。
适用场景:合并多个扁平字典
当所有字典都是“单层”的(即键值对中值不是字典),** 是最简洁高效的方式:
- Python 3.5+ 支持,语法清晰,无额外依赖
- 创建新字典,不修改原数据,线程安全
- 重复键自动以右侧字典的值覆盖(后写入优先)
示例:
dict_a = {'name': 'Alice', 'age': 30}dict_b = {'city': 'Beijing', 'age': 31}
merged = {**dict_a, **dict_b}
# → {'name': 'Alice', 'age': 31, 'city': 'Beijing'}
不适用场景:含嵌套字典时不能靠**自动深度合并
如果某个值本身就是字典(例如 dict_a = {'profile': {'height': 170}}),** 不会递归合并该子字典,只会整体替换或覆盖:
- {**dict_a, **dict_b} 中若 dict_b 也有 'profile' 键,整个 profile 字典会被替换,不是字段级合并
- 这不是缺陷,而是设计使然——** 是浅层解包,不是深度合并工具
此时需改用其他方法,如自定义递归合并函数或 DeepChainMap。
替代方案:需要保留一层嵌套逻辑时的轻量处理
若你实际想“合并多个字典,同时对同名的字典型值做一层内合并”(即深度为二),可手动结合 ** 与条件逻辑:
- 遍历所有字典,按键分组
- 对每个键,检查所有对应值是否都为字典;若是,用 {**v1, **v2, ...} 合并它们
- 否则直接取最后一个非 None 值
这种混合策略兼顾了 ** 的简洁性和对简单嵌套的可控处理,比全递归更轻量。
性能提醒:避免误用 sum() 或 + 合并字典
字典不可用 + 或 sum(..., {}) 合并——这会报错。有人混淆列表和字典操作,误以为 sum([{a:1}, {b:2}], {}) 可行,其实不行。只有 **、.update()、|(3.9+)是字典合并的合法方式。










