__init __(self,list = [])只为每个实例化创建一个列表而不是新列表?

时间:2012-04-04 00:41:57

标签: python class scope

  

可能重复:
  “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
[]

这是我期望的方式。如果使用空列表显式调用实例,而不是让默认值执行,测试也不会在实例之间共享数据,如t = Test([])。

那么默认只在编译时创建一次,而不是动态创建吗?这只适用于类定义,而不适用于一般的函数,或者这是否是在参数列表中使用默认值的更常见的陷阱? (答案:它也适用于功能。)

请注意,我使用字符串而不是列表对此进行了测试,并获得了实例之间未共享数据的预期行为。但它也确实发生在dicts上。

1 个答案:

答案 0 :(得分:2)