首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python构造函数和默认值

Python构造函数和默认值
EN

Stack Overflow用户
提问于 2011-01-30 15:48:22
回答 4查看 260.5K关注 0票数 148

在下面的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变量之外,我有没有办法继续使用构造函数参数的默认值(在本例中为空列表)?

我使用的是python 3.1.2。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-30 16:06:37

可变的默认参数通常不会做你想要的事情。相反,试着这样做:

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 
票数 172
EN

Stack Overflow用户

发布于 2011-01-30 16:14:07

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

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作为前哨数值,并为每个实例提供其自己的列表。

票数 35
EN

Stack Overflow用户

发布于 2013-02-06 06:11:43

class Node:
    def __init__(self, wordList=None adjacencyList=None):
        self.wordList = wordList or []
        self.adjacencyList = adjacencyList or []
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4841782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档