为何这段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
相关产品推荐
相关产品推荐

