能,Python 3.9 的 | 运算符可直接合并字典,返回新字典且不修改原字典;而 update() 是就地修改,二者语义与使用场景不同:需不可变操作或链式构造时用 |,需原地累积时用 update() 或 |=。

Python 3.9 的 | 运算符能直接合并字典吗?
能,但要注意它创建新字典,不修改原字典——这和 update() 的就地修改行为本质不同。如果你习惯写 d1.update(d2) 并依赖 d1 被改写,直接换成 d1 | d2 不会达到同样效果,d1 保持不变,返回的是全新对象。
什么时候该用 |,什么时候还得用 update()?
选哪个取决于你是否需要“就地更新”:
- 需要保留原字典引用、或在循环/函数中持续累积键值 → 用
update() - 想保持不可变语义、链式构造(如
d1 | d2 | d3)、或避免副作用 → 用| - 合并后立刻丢弃旧字典 →
|更清晰,且支持表达式上下文(比如函数参数里直接写func(a | b))
| 和 update() 对重复键的处理逻辑一致吗?
一致:右边字典的键值总是覆盖左边的。例如:
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
print(d1 | d2) # {'a': 1, 'b': 3, 'c': 4}
print(d1.update(d2)) # None;d1 变成 {'a': 1, 'b': 3, 'c': 4}
注意:update() 返回 None,而 | 返回新字典,别误写成 d = d | other 却以为原地改了。
用 |= 能模拟 update() 吗?
可以,|= 是就地合并运算符,Python 3.9+ 支持,行为接近 update(),但仍有细节差异:
-
d1 |= d2等价于d1.update(d2),修改d1自身 - 但
update()接受任意映射或键值对可迭代对象(如列表元组),而|=只接受dict或实现了__or__的字典子类 - 如果传入非字典(如
d1 |= [('x', 99)]),会报TypeError: unsupported operand type(s)
所以,若代码中 update() 常接收非字典参数,不能无脑替换成 |=。
真正容易被忽略的是运算符优先级:| 优先级低于 ==、in 等,写 a | b == c 实际是 a | (b == c),必须加括号。还有就是嵌套字典不会递归合并——这点无论 | 还是 update() 都一样,别指望它们做深合并。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











