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

为何这段Python代码持续输出'2'?

问题原因分析

先看你提供的代码:

class Node:
    child = []

    def __init__(self, data):
        self.data = data


node1 = Node(1)
node2 = Node(2)
node1.child.append(node2)
while node1.child:
    print(node1.child[0].data)
    node1 = node1.child[0]

问题核心是你把child定义成了类属性,而非实例属性。Python中类属性是所有该类实例共享的,也就是说node1.child和node2.child指向的是同一个列表对象。

具体执行逻辑:

  • 执行node1.child.append(node2)时,实际是给Node类的共享列表添加了node2,此时这个列表内容为[node2]。
  • 进入循环后,第一次打印node1.child[0].data(即2),随后node1被赋值为node2。
  • 此时判断循环条件node1.child,也就是node2.child——它和之前的共享列表是同一个,里面仍有node2元素,所以条件成立,继续打印2,然后node1又被赋值为node2.child[0](也就是node2自己)。
  • 如此往复,循环永远不会终止,因此会持续输出2。

修复方法

把child改成实例属性,在__init__方法里初始化每个实例独有的child列表:

class Node:
    def __init__(self, data):
        self.data = data
        self.child = []  # 每个实例拥有独立的child列表


node1 = Node(1)
node2 = Node(2)
node1.child.append(node2)
while node1.child:
    print(node1.child[0].data)
    node1 = node1.child[0]

修改后,node2的child列表是空的,循环只会执行一次,输出2后就会终止。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:50:36