1
可能重复:
“Least Astonishment” in Python: The Mutable Default Argument__init __(self,list = [])只为每个实例化创建一个列表而不是一个新列表?
为什么是这样的:
class Test:
def __init__(self, items=[]):
self.items=items
与此不同:
class Test2:
def __init__(self, items=None):
if items:
self.items=items
else:
self.items = []
茨艾伦Ë看起来他们应该做同样的事情,但:
>>>t = Test()
>>>t.items.append("stuff")
>>>t.items
['stuff']
>>>t2 = Test()
>>>t2.items
['stuff']
好了,用测试(),只有一个正在创建的列表,每个人都在访问它,尽管我认为是明确设置的项目构造函数,而不是放在类名称空间中。但与Test2:
>>>t = Test2()
>>>t.items.append("stuff")
>>>t.items
['stuff']
>>>t2 = Test2()
>>>t2.items
[]
这是我期望的方式工作。如果使用空列表显式调用它,测试也不会在实例之间共享数据,而不是让默认执行工作,如在t = Test([])中。
那么它是只在编译时创建一次,而不是动态的?这只适用于类定义,而不适用于一般的函数,或者这是在参数列表中使用默认值的更常见的陷阱? (答案:它也适用于函数。)
请注意,我使用字符串而不是列表测试了这种情况,并获得了预期的行为,即数据未在实例之间共享。但它确实也发生在字典中。