Python链式赋值产生自引用而非独立对象的运行结果该如何解释?
核心原因:你对Python链式赋值的执行逻辑理解有误
- Python中链式赋值的右侧表达式只会计算一次,仅生成唯一的对象实例,左侧所有赋值目标都会拿到这个对象的引用,而非重复创建新的相同值对象。
- 链式赋值的执行顺序是「先计算右侧表达式得到对象 → 从左到右依次给左侧目标赋值」
a = a[0] = {'a': 1}的实际执行步骤如下:
- 首先计算最右侧的
{'a': 1},生成一个字典对象,我们暂记为temp,此时temp的值为{'a': 1} - 先执行左侧第一个赋值:
a = temp,此时变量a指向temp这个字典对象 - 再执行第二个赋值:
a[0] = temp,也就是给temp这个字典新增键0,值就是temp本身
操作完成后这个字典就形成了循环引用:自己的0键指向自己,所以不管你访问多少层[0],拿到的都是同一个字典对象,输出里的{...}就是Python用来表示循环引用的标识,避免无限递归打印。
你之前的等效写法是错误的,你写的:
a = {'a': 1} a[0] = {'a': 1}
是两次创建不同的字典对象,两个字典没有关联,自然不会出现循环引用。正确的等效代码应该是:
temp = {'a': 1} a = temp a[0] = temp
内容的提问来源于stack exchange,提问作者Jruv
相关产品推荐
相关产品推荐

