2024-09-28 19:20:58 发布
网友
我不明白这是怎么回事。下面代码所示的节点实例b为什么知道单词表?在
class Node(): def __init__(self,wordList=[]): self.wordList = wordList a = Node() b = Node() a.wordList.append("hahaha!") print b.wordList
hahaha!
在Python中,这是一个常见的错误,直到您了解它的工作方式,并且 他们学会了凭直觉避免这种情况。在
问题是__init__方法的默认参数 wordlist,它是由[ ]表示的空列表,只创建一次, 解析类主体时。在
__init__
wordlist
[ ]
之后,每次调用__init__方法(自动进行 在对象实例化时)传递同一个对象-单个空列表- 作为函数的参数。因此,在上面的示例中,所有 Node将指向同一个列表-这就是您检测到的问题。在
Node
避免问题的正确模式如下:
class Node(object): def __init__(self,wordList=None): if wordlist is None: wordlist = [] self.wordList = wordList
这样,在每次__init__调用时都会创建一个新的空列表。在
在python中,默认参数与函数一起保存,当计算函数定义时,它们只会被计算一次,因为该类的所有实例都只使用一个方法,因此该方法和实例只有一个wordList默认值,因此它们的作用类似于C中的静态变量,这就是为什么您永远不应该有可变的默认参数,请阅读本文了解更多细节http://effbot.org/zone/default-values.htm
wordList
这可能会让它更清楚一点:
class Node(): def __init__(self,wordList=[]): self.wordList = wordList a = Node() b = Node() print(id(a.wordList)) print(id(b.wordList))
结果是
。。。换句话说,a.wordList和b.wordList都引用同一个列表。在
在Python中,这是一个常见的错误,直到您了解它的工作方式,并且 他们学会了凭直觉避免这种情况。在
问题是
__init__
方法的默认参数wordlist
,它是由[ ]
表示的空列表,只创建一次, 解析类主体时。在之后,每次调用
__init__
方法(自动进行 在对象实例化时)传递同一个对象-单个空列表- 作为函数的参数。因此,在上面的示例中,所有Node
将指向同一个列表-这就是您检测到的问题。在避免问题的正确模式如下:
这样,在每次
__init__
调用时都会创建一个新的空列表。在在python中,默认参数与函数一起保存,当计算函数定义时,它们只会被计算一次,因为该类的所有实例都只使用一个方法,因此该方法和实例只有一个
wordList
默认值,因此它们的作用类似于C中的静态变量,这就是为什么您永远不应该有可变的默认参数,请阅读本文了解更多细节http://effbot.org/zone/default-values.htm这可能会让它更清楚一点:
结果是
^{pr2}$。。。换句话说,a.wordList和b.wordList都引用同一个列表。在
相关问题 更多 >
编程相关推荐