2014-02-08 82 views
1

我無法理解這是如何工作的。如何在下面的代碼中顯示Node的實例b知道關於wordlist的內容?Python全局類屬性

class Node(): 
def __init__(self,wordList=[]): 
    self.wordList = wordList 

a = Node() 
b = Node() 

a.wordList.append("hahaha!") 
print b.wordList 

哈哈哈!

+0

不確定這應該被關閉爲重複的鏈接問題。當然,標題應該改爲更有意義的內容以供其他人檢索 – joaquin

回答

3

這是一個常見的錯誤,直到你找到它的方式,他們學會避免這種直覺。

的問題是,默認參數爲__init__方法 wordlist,這是[ ]表示上午空列表創建了一次, 上課的時候身體被解析。

在那之後,每次調用到__init__方法(在對象的實例化自動 製造)通過相同的對象 - 的單空列表 - 作爲參數傳遞給該函數。因此,在上面的示例中, Node的所有實例都將指向相同的列表 - 這是您檢測到的問題。

正確的模式來避免這個問題是這樣的:

class Node(object): 
def __init__(self,wordList=None): 
    if wordlist is None: wordlist = [] 
    self.wordList = wordList 

這種方式,在每一個__init__調用創建一個新的空IST。

2

在Python中默認參數保持與功能,當函數定義進行評估,他們評估一次,因爲你必須通過該類的所有實例只使用一種方法,因此只有一個wordList該方法默認和實例,所以它們在C中像一個靜態變量,這就是爲什麼你永遠不應該有可變的默認參數,閱讀這個更多細節http://effbot.org/zone/default-values.htm

0

這可能使它更清楚一點:

class Node(): 
    def __init__(self,wordList=[]): 
     self.wordList = wordList 

a = Node() 
b = Node() 

print(id(a.wordList)) 
print(id(b.wordList)) 

導致類似

41474968 
41474968 

...換句話說,a.wordList和b.wordList都是指的同樣的名單