3

可能的重复:
Python 中的“Least Astonishment”:可变默认参数

我有以下代码:

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

它打印:

{0: <__main__.Node object at 0x10586de90>}
{0: <__main__.Node object at 0x10586de90>}

所以我的问题是,为什么在 n2 中定义了孩子?Children 是一个实例变量,但它的行为就像一个类变量。

谢谢

4

3 回答 3

4

您正在为children每个实例分配相同的字典。

于 2012-10-30T17:27:16.093 回答
2

当你定义函数时__init__,你给它一个字典作为默认参数。该字典创建一次(当您定义函数时),然后每次__init__调用时使用。

更多信息: http ://effbot.org/zone/default-values.htm

于 2012-10-30T17:28:20.623 回答
1

正如 Martijn 的评论和 kindall 的回答中所指出的,您遇到了可变的默认参数行为,这在某些时候会困扰大多数 Python 开发人员,您可以通过以下方式进行修改Node.__init__(),使其按您期望的方式工作:

class Node(object):
    def __init__(self, value = 0, children = None):
        self.val = value
        if children is None:
            self.children = {}
        else:
            self.children = children
于 2012-10-30T17:31:12.587 回答