Python列表互相append出现[...]循环引用的原因解析
为什么两个列表互相append后会出现无限循环的输出?
先看你的代码场景:
a = [1, 2, 3, 4, 5] b = [9, 8, 7] a.append(b) b.append(a) print(a) # 实际输出: [1, 2, 3, 4, 5, [9, 8, 7, [...]]] print(b) # 实际输出: [9, 8, 7, [1, 2, 3, 4, 5, [...]]]
根本原因:Python列表是引用类型的可变对象
Python里的列表不是直接存储具体值的容器,而是存储对象引用的集合。当你执行a.append(b)时,并没有把b的元素复制一份放进a,而是直接把指向b这个列表对象的"引用"塞进了a的末尾——这时候a的最后一个元素就是b本身,不是它的副本。
紧接着执行b.append(a),同样是把指向a的引用放进b的末尾。这下就形成了循环引用:a里包含b的引用,b里又包含a的引用,两者互相指向对方,形成了一个闭环。
为什么会出现[...]和无限遍历?
当Python打印列表时,会递归遍历每个元素。但碰到这种循环引用的情况,如果一直递归下去就会陷入无限循环,所以Python会用[...]来标记"这里是一个已经出现过的列表,形成了循环引用",避免无限打印。
而当你手动遍历列表元素时,比如遍历a的元素,拿到a的最后一个元素(也就是b)后,再遍历b的元素又会拿到a,接着再遍历a又拿到b……这样就会无限循环下去,永远停不下来。
想要得到预期结果怎么办?
如果只是想把对方的元素副本添加进去,而不是引用本身,可以用copy()方法或者切片来创建列表的独立副本:
a = [1, 2, 3, 4, 5] b = [9, 8, 7] a.append(b.copy()) # 或者用 b[:] 生成副本 b.append(a.copy()) # 或者用 a[:] print(a) # 输出: [1, 2, 3, 4, 5, [9, 8, 7]] print(b) # 输出: [9, 8, 7, [1, 2, 3, 4, 5]]
这样添加的是各自的独立副本,不会形成循环引用,就能得到你一开始预期的输出。
内容的提问来源于stack exchange,提问作者Karan Shah
相关产品推荐
相关产品推荐

