Python全局类attribu

2024-09-28 19:20:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我不明白这是怎么回事。下面代码所示的节点实例b为什么知道单词表?在

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

a = Node()
b = Node()

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

hahaha!


Tags: 实例代码selfnode节点initdefclass
3条回答

在Python中,这是一个常见的错误,直到您了解它的工作方式,并且 他们学会了凭直觉避免这种情况。在

问题是__init__方法的默认参数 wordlist,它是由[ ]表示的空列表,只创建一次, 解析类主体时。在

之后,每次调用__init__方法(自动进行 在对象实例化时)传递同一个对象-单个空列表- 作为函数的参数。因此,在上面的示例中,所有 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

这可能会让它更清楚一点:

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

a = Node()
b = Node()

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

结果是

^{pr2}$

。。。换句话说,a.wordList和b.wordList都引用同一个列表。在

相关问题 更多 >