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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:27:24