2016-11-04 131 views
-1

当我运行这段代码:追加对象列表修改对象

class Node: 
    children = [] 
    num_children = 0 
    isleaf = True 
    def __init__(self,name): 
     print("constructor called for " + name) 
     self.name = str(name) 



    def add_child(self,child_node): 
     print("adding child called "+child_node.name+ " to "+ self.name) 
     print("I ("+self.name+ ") have " + str(len(self.children)) + " children") 
     print("checking: " + child_node.name + " reports " + str(len(child_node.children)) + " children") 
     #cc = copy.deepcopy(child_node) 
     self.children.append(child_node) 
     #self.children.append(1) 
     #self.children[0] = child_node 
     print("checking again: " + child_node.name + " reports " + str(len(child_node.children)) + " children") 
     self.isleaf = False 
     self.num_children = self.num_children +1 
     print("I ("+self.name+ ") now have " + str(len(child_node.children)) + " children") 



root = Node("a") 


testn = Node("b") 

root.add_child(testn) 


print(root.children[0].name) 

我得到这样的输出:

constructor called for a 
constructor called for b 
adding child called b to a 
I (a) have 0 children 
checking: b reports 0 children 
checking again: b reports 1 children 
I (a) now have 1 children 
b 

为什么代码行:

self.children.append(child_node) 

添加孩子(B)以及父母(A)?

我希望它只是个孩子添加到父(A

+0

你想让'children'成为一个类变量吗? – 2016-11-04 11:35:26

+0

是的,孩子应该是节点的成员。我正在尝试并未能实现树 –

+0

如果您希望'children'是一个实例变量,请将其设为一个。请参阅下面的答案。 – 2016-11-04 11:37:04

回答

0

移动children = []__init__使它成为实例成员。现在它是一个成员:

def __init__(self, name): 
    self.children = [] 
    self.num_children = 0 
    self.isleaf = True 
+0

,导致b没有任何孩子:( –

+1

@RNs_Ghost这是正确的行为,不是吗?另外,为什么你有一个属性重复'len(self.children)'? – jonrsharpe

+0

对不起,我的意思是,结果在一个不有任何孩子。这种重复存在,因为我一直在尝试很多不同的事情来调试它 –

0

那是因为你的孩子定义为类变量,而不是作为一个实例变量。这意味着children并不真正属于roottestn,而是属于Node本身。

要修复它只需在__init__内部替换children = []self.children = []

+0

这导致(a)没有任何孩子 –