Python constructor and default value

This question already has an answer here:

  • “Least Astonishment” and the Mutable Default Argument 30 answers

  • Mutable default arguments don't generally do what you want. Instead, try this:

    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 
    

    Let's illustrate what's happening here:

    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],)
    

    You can see that the default arguments are stored in a tuple which is an attribute of the function in question. This actually has nothing to do with the class in question and goes for any function. In python 2, the attribute will be func.func_defaults .

    As other posters have pointed out, you probably want to use None as a sentinel value and give each instance it's own list.


    I would try:

    self.wordList = list(wordList)
    

    to force it to make a copy instead of referencing the same object.

    链接地址: http://www.djcxy.com/p/28516.html

    上一篇: 为什么空字典在Python中是一个危险的默认值?

    下一篇: Python的构造函数和默认值