update()就地修改原字典且返回none,解包(**)生成新字典且原字典不变;二者均只浅合并,嵌套字典需手动递归或第三方库处理。

Python字典合并,update() 和解包(**)是两种常用方式,核心区别在于:前者就地修改原字典、不产生新对象;后者生成全新字典、原字典完全不变。
update():直接改原字典,适合复用场景
update() 是字典的原地方法,接收另一个字典或可迭代的键值对,把内容“塞进”调用者中。如果键已存在,值会被覆盖。
- 不返回新字典,返回
None,不能链式调用 - 支持多种输入:字典、关键字参数、含二元组的列表等,例如
d.update({'a':1}, b=2, [('c',3)]) - 若需保留原字典,必须先
copy(),否则原始数据被改动
解包(**):创建新字典,函数式更安全
用 {**d1, **d2} 合并,本质是构造一个新字典字面量。右侧字典的同名键会覆盖左侧的值,顺序决定优先级。
- 原字典完全不受影响,天然符合不可变思维,适合传参、配置拼接等场景
- 只能解包映射类型(如 dict),不支持关键字参数或混合结构
- Python 3.9+ 可用
|运算符替代,写法更简洁:d1 | d2
性能与可读性取舍
小数据量下差异可忽略;大数据量时,update() 略快(少一次内存分配),但解包更直观、不易出错。
立即学习“Python免费学习笔记(深入)”;
- 想明确表达“叠加配置”,推荐解包或
|,语义清晰 - 在循环中反复更新同一字典(如聚合统计),
update()更自然 - 多字典合并时,解包可一次写完:
{**d1, **d2, **d3};update()需多次调用或用functools.reduce
注意嵌套字典不会自动递归合并
无论哪种方式,都只做浅合并。如果 d1['x'] 和 d2['x'] 都是字典,解包或 update() 都会直接用 d2['x'] 替换整个值,而非合并其内部键值。
- 需要深层合并,得手动递归或借助第三方库(如
deepmerge) - 临时方案:用
collections.ChainMap实现逻辑上的“叠加视图”,不真正合并










