Элемент добавления Python в список экземпляров также добавляет его в список других экземпляров

Возможный дубликат:
«Наименьшее удивление» в Python: аргумент Mutable Default

Я создал класс Person, у которого есть имя и список детей. Дети одного класса Лица. Если я создаю два экземпляра Person и добавлю ребенка к одному из экземпляров person, он добавляется в оба экземпляра Person. Я предполагаю, что ребенок должен быть добавлен только к детям человека1, а не к человеку2, но он добавляется к обоим. Я должен делать что-то очевидное неправильно, но я не вижу этого.

Аналогичные вопросы показали, что люди добавляют определение переменной к самому классу, а не к конструктору, но это не то, что здесь происходит. Любая помощь будет высоко оценена, она жарит мой мозг!

Ниже приведен код и вывод:

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() 

вывод этого кода:

 Person 1's children: [<Person 1's child>] Person 2's children: [<Person 1's child>] 

2 Solutions collect form web for “Элемент добавления Python в список экземпляров также добавляет его в список других экземпляров”

Проблема заключается в значении по умолчанию для параметра children . Если вы используете изменяемый объект (например, список) и инициализируете его в заголовке, он будет инициализирован только один раз и затем будет использоваться во всех экземплярах.

Это обсуждалось здесь .

Попробуйте заменить

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

с

 def __init__(self, name, children=None): self.name = name if children is None: self.children = [] else: self.children = children 

Для вашего init используйте вместо этого:

 def __init__(self, name, children=None): self.name = name if children is None: self.children = [] else: self.children = children 

То, что происходит, состоит в том, что два объекта Person используют один и тот же список в фоновом режиме (список привязывается, когда функция определена, а не когда она выполняется). Взгляните на этот вопрос еще немного.

  • Как создать экземпляр класса внутри этого метода класса?
  • Как создать отдельные экземпляры класса в Python?
  • python: доступ к переменной экземпляра с использованием имени, содержащего переменную
  • Как я могу вызвать объект GUI или больше из основного класса
  • Python создает несколько экземпляров для одного объекта / класса
  • Ошибка: «x экземпляр не имеет атрибута y» при попытке наследовать из класса
  • В цикле в Python я назначаю новый экземпляр класса той же переменной, но он продолжает указывать на старый экземпляр?
  • Как получить экземпляр с помощью метода экземпляра?
  • Python - лучший язык программирования в мире.