Possible Duplicate:
“Least Astonishment” in Python: The Mutable Default Argument
I have the following code:
class Node(object):
def __init__(self, value = 0, children = {}):
self.val = value
self.children = children
def setChildValue(self, index, childValue):
self.children[index] = Node(childValue)
n = Node()
n.setChildValue(0,10)
print n.children
n2 = Node()
print n2.children
And it prints:
{0: <__main__.Node object at 0x10586de90>}
{0: <__main__.Node object at 0x10586de90>}
So my question is, why is children defined in n2? Children is an instance variable and yet it's acting like a class variable.
Thanks
When you define the function
__init__
you give it a dictionary as a default argument. That dictionary is created once (when you define the function) and then used every time__init__
is called.More information: http://effbot.org/zone/default-values.htm
As indicated in Martijn's comment and kindall's answer, you are running into the mutable default argument behavior which bites most Python developers at some point, here is how you can modify
Node.__init__()
so that it works the way you expect:You're assigning the same dictionary to
children
on every instance.