这是我的代码,我想做一个简单的节点树:
class Node(object):
child = []
def __init__(self,id):
self.id =id
def addChild(self,child):
self.child.append(child)
def printChildOnwards(self):
yield self.id
for x in self.child:
yield from x.printChildOnwards()
firstChild = Node('1')
secondChild = Node('2')
thirdChild = Node('3')
fourthChild = Node('4')
firstChild.addChild(secondChild)
firstChild.addChild(thirdChild)
for x in firstChild.printChildOnwards():
print(x)
我已经通过self
访问了定义的类级别属性,以确保我正在访问它自己的版本
输出:
1 2 2 2 2 ... then recursion error max depth
虽然如果我像这样在__init__
中简单地定义它,它是可以工作的
self.child = []
输出:1 2 3
这种行为背后的原因是什么?为什么我需要将其包含在__init__
中
在您最初的示例中:
child
属性是Node
类上的一个类级属性,这意味着Node
的每个实例都将共享该对象,因此通过printChildOnwards
调用的每次迭代都将保持从同一列表打印。正如您所发现的,在__init__
方法中定义它是有效的,因为这会为每个实例创建一个实例级别的child
属性,因此它们现在都是唯一的,不会导致遍历相同的子级共享列表您可以使用^{} 函数轻松地验证任何对象的标识(内存地址)。因此,您可以自己看到,使用此示例的子属性是相同的:
将其更改回您修复的版本:
再次使用^{} 函数进行验证,并查看它们是否不同
相关问题 更多 >
编程相关推荐