Python 附加到实例化对象中的列表

Python 附加到实例化对象中的列表,python,oop,Python,Oop,我正在尝试将项目附加到实例化对象中的列表: 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) # [] pr

我正在尝试将项目附加到实例化对象中的列表:

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']

我所期望的行为是灯在客厅里,而不是在餐厅里。有人能解释一下吗?

contents
是一个可变的默认参数。它的默认值(空列表)只创建一次,而不是每次调用

详情如下:

内容
是一个可变的默认参数。它的默认值(空列表)只创建一次,而不是每次调用

详情如下:

没错,但我不确定它是否完全解决了这个问题。我没有再次调用实例化对象,我向它附加了一些东西,它还附加到同一类的另一个实例化对象。您真的不能在实例化对象中向列表中添加内容吗?据我所知,默认参数是在函数的作用域中创建的,而函数的作用域又是在类的作用域中创建的。因此
Room
的所有实例都共享该列表。如果希望每个实例都是独立的,您可以将它们交给它们自己的列表:
Room('laving Room',contents=[])
OK,谢谢。我最后所做的只是将self.contents=[]放在init方法的主体中,并将内容排除在参数之外!使用检查来确定内容的值(如果contents=[]:self.\uu contents=[]:else:self.\uuu contents=contents),这允许您获得最初所需的灵活性,但是我建议删除默认参数!这是真的,但我不确定它是否完全解决了这个问题。我没有再次调用实例化对象,我向它附加了一些东西,它还附加到同一类的另一个实例化对象。您真的不能在实例化对象中向列表中添加内容吗?据我所知,默认参数是在函数的作用域中创建的,而函数的作用域又是在类的作用域中创建的。因此
Room
的所有实例都共享该列表。如果希望每个实例都是独立的,您可以将它们交给它们自己的列表:
Room('laving Room',contents=[])
OK,谢谢。我最后所做的只是将self.contents=[]放在init方法的主体中,并将内容排除在参数之外!使用检查来确定内容的值(如果contents=[]:self.\uu contents=[]:else:self.\uuu contents=contents),这允许您获得最初所需的灵活性,但是我建议删除默认参数!