【发布时间】:2012-04-17 17:00:23
【问题描述】:
可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
为什么会这样:
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']
好的,所以使用 Test(),只创建了一个列表,并且每个人都在访问它,尽管我认为是在构造函数中显式设置项目而不是将其放在类命名空间中。但是使用 Test2:
>>>t = Test2()
>>>t.items.append("stuff")
>>>t.items
['stuff']
>>>t2 = Test2()
>>>t2.items
[]
这是我期望的方式。如果您使用空列表显式调用 Test 而不是让默认值完成工作,Test 也不会在实例之间共享数据,如 t = Test([])。
那么默认值是否只在编译时创建一次,而不是动态创建?这仅适用于类定义,而不适用于一般的函数,或者这是在参数列表中使用默认值的更普遍的陷阱? (答案:函数也会发生这种情况。)
请注意,我使用字符串而不是列表对此进行了测试,并且在实例之间未共享数据的情况下得到了预期的行为。但它也确实发生在 dicts 上。
【问题讨论】: