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

时间:2011-04-20 18:35:30

标签: python nodes

我正在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 个答案:

答案 0 :(得分: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 = []

答案 1 :(得分:0)

我怀疑children以某种方式在所有节点对象中共享;我们看不到声明,所以我不能确切地说出你做错了什么。