访问从类定义的数组属性时发生递归错误

2024-09-29 19:26:48 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的代码,我想做一个简单的节点树:

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__


Tags: inselfidnodechildfor定义init
1条回答
网友
1楼 · 发布于 2024-09-29 19:26:48

在您最初的示例中:

class Node(object):

    child = []

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

child属性是Node类上的一个类级属性,这意味着Node的每个实例都将共享该对象,因此通过printChildOnwards调用的每次迭代都将保持从同一列表打印。正如您所发现的,在__init__方法中定义它是有效的,因为这会为每个实例创建一个实例级别的child属性,因此它们现在都是唯一的,不会导致遍历相同的子级共享列表

您可以使用^{}函数轻松地验证任何对象的标识(内存地址)。因此,您可以自己看到,使用此示例的子属性是相同的:

>>> n1 = Node(1)
>>> n2 = Node(2)
>>> id(n1.child)
139928077828744
>>> id(n2.child)
139928077828744

将其更改回您修复的版本:

class Node(object):             
    def __init__(self, id):     
        self.child = []              
        self.id = id            

再次使用^{}函数进行验证,并查看它们是否不同

>>> n1 = Node(1)                                               
>>> n2 = Node(2)                                                               
>>> id(n1.child)
139928077829192
>>> id(n2.child)
139928077828936

相关问题 更多 >

    热门问题