Somehow, in the Node class below, the
adjacencyList variable is shared between all instances of 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']
Is there any way I can keep using the default value (empty list in this case) for the constructor parameters but to get both
b to have their own
I am using python 3.1.2.
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__ (,) >>> 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
As other posters have pointed out, you probably want to use
None as a sentinel value and give each instance it's own list.