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

OrderedSet实现中双向链表代码的递归变量自引用疑问

理解Python中自引用列表形成的循环

咱们一步步拆解这段代码的执行逻辑,就能搞清楚它怎么形成无限循环引用了:

第一步:创建初始列表

list_ = []

这行代码创建了一个空列表对象,变量list_就像一个标签,指向这个空列表。你可以把这个列表想象成一个空盒子,list_就是用来找到这个盒子的标识。

第二步:给列表添加自引用元素

list_ += [None, list_, list_]

这里的核心是Python的可变对象引用特性,以及+=的行为:

  • 首先构造临时列表[None, list_, list_]:这里的两个list_并不是复制原列表,而是直接指向原空列表对象的引用(也就是那个空盒子的标签)。
  • +=操作是在原列表对象上直接修改,把临时列表的三个元素添加到原空列表里。

这时候,原列表对象就变成了:[None, 原列表对象本身, 原列表对象本身]。也就是说,这个列表的第1、第2个元素,都是指向它自己的引用!

为什么会无限循环打印?

当你执行print list_[1]时,你访问的是列表的第1个元素,而这个元素就是列表自己。Python在打印时发现了这种循环引用——列表里包含它自己,它自己又嵌套自己,无限递归——于是用[...]来标记这种循环,避免无限打印。

不管你访问多少次list_[1][1][1]...,每次得到的都是同一个列表对象,所以结果永远是[None, [...], [...]]。

打个比方:就像你在镜子对面再放一面镜子,两面镜子互相反射,你看到的就是无限嵌套的镜像,本质上都是同一组镜子的反射结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:21:04