我正在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]
两行输出应该是相同的,因为它们之间的代码行应该只影响父节点,而不是当前正在构造的节点。
我做错了什么?
答案 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
以某种方式在所有节点对象中共享;我们看不到声明,所以我不能确切地说出你做错了什么。