我无法理解这是如何工作的。如何在下面的代码中显示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