在节点树中,parent.addChild(self)将self添加到自我

0 投票
2 回答
2051 浏览
提问于 2025-04-16 16:07

我正在用Python构建一个简单的节点树。但是当我的构造函数试图把当前节点添加为某个父节点的子节点时,当前节点也会把自己添加为自己的子节点。

这是我的构造函数方法(以及children的创建):

children = []

def __init__(self, parent=None, tag="[ROOT]", attrs=None):
        self.parent = parent
        self.tag = tag
        self.attrs = attrs
        print "\n", "self:%s ... children:%s" % (self.tag, self.children)
        if parent != None:
            parent.addChild(self)
        print "self:%s ... children:%s" % (self.tag, self.children)

这是我在同一个类中的addChild方法(这个方法应该是为父节点调用的,而不是当前正在构建的节点):

def addChild(self, child):
        self.children.append(child)

这是输出结果:

foo []
foo [foo]

这两行输出应该是相同的,因为它们之间的代码只应该影响父节点,而不应该影响当前正在构建的节点。

我哪里做错了?

2 个回答

4

当你在类的层级上初始化子对象时,你的每个类实例都会共享同一个列表对象。

>>> class C:
...  children = []
... 
>>> a = C()
>>> b = C()
>>> id(a.children)
144349644
>>> id(b.children)
144349644

试着在你的构造函数里初始化它:

def __init__(self, parent=None, tag="[ROOT]", attrs=None):
    self.children = []
0

我怀疑你们的 children 可能在所有的节点对象之间是共享的;因为我们看不到它的声明,所以我不能确切地说你哪里做错了。

撰写回答