2014-02-08 53 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都是指的同样的名单