2016-05-07 2 views
0

Я пытаюсь добавить элементы в список в реализованным объекте:прилагая к списку в конкретизированном объекте

class Room(object): 
    def __init__(self, name, contents=[]): 
     self.name = name 
     self.contents = contents 


living_room = Room('living room') 
dining_room = Room('dining room') 

print(living_room.contents) # [] 
print(dining_room.contents) # [] 

living_room.contents.append('lamp') 

print(living_room.contents) # ['lamp'] 
print(dining_room.contents) # ['lamp'] 

поведение я бы ожидать, был бы для лампы, чтобы быть в living_room.contents, но не в dining_room.contents. Может кто-нибудь объяснить это?

ответ

2

contents - изменяемый аргумент по умолчанию. Значение по умолчанию (пустой список) создается только один раз, а не для каждого вызова.

Вот более подробная информация: http://docs.python-guide.org/en/latest/writing/gotchas/

+0

Это правда, но я не уверен, что он рассматривает вопрос полностью. Я еще не вызывал экземпляр объекта, я добавил что-то к нему, а также добавил к другому экземпляру объекта того же класса. Это правда, что вы не можете добавлять вещи в список в экземпляр объекта? –

+0

Насколько я знаю, аргумент по умолчанию создается в области функции, которая, в свою очередь, создается в области действия класса. Таким образом, все экземпляры «комнаты» делят список. Вы можете передать каждому экземпляру свой собственный список, если хотите, чтобы он был независимым: 'Room ('living room', contents = [])' – jab

+0

Хорошо, спасибо. То, что я закончил, это просто положить self.contents = [] в тело метода __init__ и оставить содержимое из аргументов. –

Смежные вопросы