You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Python中|=运算符可以原地更新字典内的集合值?

Python 集合 |= 与 x = x | 的行为差异原理

核心底层逻辑

两种写法的本质区别是是否修改原内存对象,结合代码逐行分析如下:

代码执行的前提状态

前两行代码执行后:

tmp_dict = {}
x = tmp_dict.setdefault("key1", set())

setdefault 会将空set写入tmp_dict["key1"],同时返回该set的内存引用,此时 x 和 tmp_dict["key1"] 指向内存中同一个集合对象。


第一种写法:x |= {1,2}

增量赋值运算符|=对于集合这种可变对象,调用的是魔术方法__ior__,属于就地修改操作:

  • 不会生成新的集合对象,直接修改x指向的原集合内容
  • x的指向始终和tmp_dict["key1"]保持一致
  • 因此字典内的集合会同步更新,最终输出为{'key1': {1, 2}}

第二种写法:x = x | {1,2}

普通按位或运算符|调用的是魔术方法__or__,会生成一个全新的集合对象作为返回值:

  • 新的集合对象包含合并后的元素,赋值给x后,x的指向会变更为这个新对象
  • 原tmp_dict["key1"]指向的空集合没有被做任何修改
  • 因此最终字典内的集合仍然是空,输出为{'key1': set()}

补充说明

两种写法的等价性只在操作不可变对象时成立:

  • 对于int、str、tuple这类不可变对象,|=底层也会生成新对象再赋值,和x = x | y效果完全一致
  • 对于set、list这类可变对象,增量赋值运算符默认实现为就地修改,和重新赋值的写法存在本质差异

内容的提问来源于stack exchange,提问作者GinChow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:54:06