为什么实例变量行为像Python中的类变量? [重复](Why is instance vari

2019-07-03 11:35发布

可能重复:
“最小惊讶”在Python:易变的默认参数

我有以下代码:

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定义的孩子吗? 儿童是一个实例变量,但它像个类变量。

谢谢

Answer 1:

你分配相同的字典children在每一个实例。



Answer 2:

当你定义的函数__init__你给它一个字典作为默认参数。 那本词典创建一次,(当你定义的函数),然后每次使用__init__被调用。

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



Answer 3:

正如马亭的评论和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


文章来源: Why is instance variable behaving like a class variable in Python? [duplicate]