Python 构造函数和默认值

以某种方式,在下面的 Node 类中,wordListadjacencyList变量在 Node 的所有实例之间共享。

>>> class Node:
...     def __init__(self, wordList = [], adjacencyList = []):
...         self.wordList = wordList
...         self.adjacencyList = adjacencyList
...
>>> a = Node()
>>> b = Node()
>>> a.wordList.append("hahaha")
>>> b.wordList
['hahaha']
>>> b.adjacencyList.append("hoho")
>>> a.adjacencyList
['hoho']

有没有什么办法可以让我继续使用构造函数参数的默认值(在本例中是空列表) ,但是让 ab都有自己的 wordListadjacencyList变量呢?

我使用的是 python3.1.2。

284865 次浏览

我会试试:

self.wordList = list(wordList)

强制它复制而不是引用同一个对象。

可变的默认参数通常不能满足您的需要:

class Node:
def __init__(self, wordList=None, adjacencyList=None):
if wordList is None:
self.wordList = []
else:
self.wordList = wordList
if adjacencyList is None:
self.adjacencyList = []
else:
self.adjacencyList = adjacencyList

让我们来说明一下这里发生了什么:

Python 3.1.2 (r312:79147, Sep 27 2010, 09:45:41)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo:
...     def __init__(self, x=[]):
...         x.append(1)
...
>>> Foo.__init__.__defaults__
([],)
>>> f = Foo()
>>> Foo.__init__.__defaults__
([1],)
>>> f2 = Foo()
>>> Foo.__init__.__defaults__
([1, 1],)

您可以看到默认参数存储在一个元组中,该元组是该函数的一个属性。这实际上与所讨论的类没有任何关系,适用于任何函数。在 python2中,属性将是 func.func_defaults

正如其他海报所指出的,您可能希望使用 None作为前哨值,并为每个实例提供它自己的列表。

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