|比update()更直观,因为|是表达式,能直接赋值、返回、链式调用;update()是就地修改语句,返回none,易致静默错误,如merged = d1.update(d2)使merged为none。

为什么|比update()更直观
因为|是表达式,能直接参与赋值、返回、链式调用;update()是就地修改的语句,返回None,写错就静默出错。
update()最常踩的坑:赋值后变量变None
新手写merged = d1.update(d2)以为得到合并结果,实际merged是None——这是update()的设计决定的,它不返回字典,只改自己。
- 必须分两步:
merged = d1.copy(); merged.update(d2) - 若忘了
copy(),d1就被改了,后续逻辑可能依赖原值 - 函数参数里不能直接用:
func(d1.update(d2))传进去的是None,不是字典
|天然支持“构造新值”的语义
它像+或|在集合中一样,输入两个字典,输出一个新字典,无副作用。这种纯函数式行为,在配置拼接、API 参数组装、测试数据构造等场景下,一眼就能看出意图。
-
d1 | d2 | d3可读性远高于{**(d1.copy().update(d2) or d1), **d3} - 能直接用于
return、lambda、defaultdict工厂函数等表达式上下文 - 右操作数优先覆盖的规则和数学并集直觉一致,不用查文档确认覆盖方向
容易被忽略的关键细节
很多人以为|只是语法糖,其实它和update()在底层实现、错误提示、类型检查上都不同。比如d1 | None报TypeError明确指出“unsupported operand”,而d1.update(None)报错是“argument must be mapping or iterable”,信息更模糊;再比如frozendict能参与|(只要实现keys()和__getitem__()),但不能调用update()——这种差异在真实项目里会影响接口设计弹性。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











