2012-04-04 85 views
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([])中。

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

请注意,我使用字符串而不是列表测试了这种情况,并获得了预期的行为,即数据未在实例​​之间共享。但它确实也发生在字典中。

回答

相关问题