我無法理解這是如何工作的。如何在下面的代碼中顯示Node的實例b知道關於wordlist的內容?Python全局類屬性
class Node():
def __init__(self,wordList=[]):
self.wordList = wordList
a = Node()
b = Node()
a.wordList.append("hahaha!")
print b.wordList
哈哈哈!
我無法理解這是如何工作的。如何在下面的代碼中顯示Node的實例b知道關於wordlist的內容?Python全局類屬性
class Node():
def __init__(self,wordList=[]):
self.wordList = wordList
a = Node()
b = Node()
a.wordList.append("hahaha!")
print b.wordList
哈哈哈!
這是一個常見的錯誤,直到你找到它的方式,他們學會避免這種直覺。
的問題是,默認參數爲__init__
方法 wordlist
,這是[ ]
表示上午空列表創建了一次, 上課的時候身體被解析。
在那之後,每次調用到__init__
方法(在對象的實例化自動 製造)通過相同的對象 - 的單空列表 - 作爲參數傳遞給該函數。因此,在上面的示例中, Node
的所有實例都將指向相同的列表 - 這是您檢測到的問題。
正確的模式來避免這個問題是這樣的:
class Node(object):
def __init__(self,wordList=None):
if wordlist is None: wordlist = []
self.wordList = wordList
這種方式,在每一個__init__
調用創建一個新的空IST。
在Python中默認參數保持與功能,當函數定義進行評估,他們評估一次,因爲你必須通過該類的所有實例只使用一種方法,因此只有一個wordList
該方法默認和實例,所以它們在C中像一個靜態變量,這就是爲什麼你永遠不應該有可變的默認參數,閱讀這個更多細節http://effbot.org/zone/default-values.htm
這可能使它更清楚一點:
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都是指的同樣的名單。
不確定這應該被關閉爲重複的鏈接問題。當然,標題應該改爲更有意義的內容以供其他人檢索 – joaquin