2016-11-04 100 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)沒有任何孩子 –