2013-10-12 3 views
0

Я пытаюсь написать класс узла для создания древовидной структуры. Кажется, есть проблема, когда я пытаюсь добавить дочерний узел к корневому узлу с помощью метода «addChild», потому что дочерний узел, похоже, сам входит в список своих детей. Я не мог понять, почему, поэтому любая помощь приветствуется.Вставка узла в дерево в python

class node(object): 
    def __init__(self, name, x, y, children = []): 
     self.name = name 
     self.children = children 
     self.x = x 
     self.y = y 

    def addChild(self): 
     b=node('b', 5, 5) 
     self.children.append(b) 
     return 

root=node('a',0.,0.) 
print root.children 

root.addChild() 

print root.children 
print root.children[0].children 

Урожайность:

[<__main__.node object at 0x7faca9f93e50>] 
[<__main__.node object at 0x7faca9f93e50>] 

В то время как во второй строке "печать" должен был возвращен пустой массив.

+1

Каждый узел, ссылающийся на тот же список. См. Http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument – Tim

ответ

3

Значение по умолчанию children = [] присваивает единый объект списка функции __init__, которая затем используется для каждого вызова всех детей. This is a common mistake. Вместо этого создайте children в самой __init__ функции:

class node(object): 
    def __init__(self, name, x, y, children=None): 
     self.name = name 
     self.children = [] if children is None else children 
     self.x = x 
     self.y = y 
# ... 
Смежные вопросы