Python将元素添加到实例列表中也会将其添加到另一个实例的列表中

zee*_*fox 5 python class instance-variables

可能重复:
Python中的"最小惊讶":可变默认参数

我创建了一个Person类,它有一个名字和一个子列表.孩子们属于同一个人类.如果我创建两个Person实例,并将子项添加到其中一个人员实例,则会将其添加到两个Person实例中.我认为孩子应该只添加到person1的孩子而不是person2,但它会被添加到两者中.我必须做一些明显不对的事,但我看不出来.

类似的问题表明人们将变量定义添加到类本身而不是构造函数,但这不是这里发生的事情.任何帮助都会非常感激,它正在煎炸我的大脑!

请参阅下面的代码和输出:

class Person(object):

    def __init__(self, name, children=[]):
        self.name = name
        self.children = children

    def __repr__(self):
        return '<' + self.name + '>'

    def add_child(self, child):
        self.children.append(child)


def main():
    person1 = Person('Person1')
    person2 = Person('Person2')

    person1.add_child(Person("Person 1's child"))

    print "Person 1's children:", person1.children
    print "Person 2's children:", person2.children

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

此代码的输出是:

Person 1's children: [<Person 1's child>]
Person 2's children: [<Person 1's child>]
Run Code Online (Sandbox Code Playgroud)

eum*_*iro 7

问题在于children参数的默认值.如果您使用可变对象(例如列表)并在标头中初始化它,它将只初始化一次,然后在所有实例中使用.

这已在此处讨论.

尝试更换

def __init__(self, name, children=[]):
    self.name = name
    self.children = children
Run Code Online (Sandbox Code Playgroud)

def __init__(self, name, children=None):
    self.name = name
    if children is None:
        self.children = []
    else:
        self.children = children
Run Code Online (Sandbox Code Playgroud)