1

可能的重复:
Python 中的“Least Astonishment”:可变默认参数

为什么是这样:

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 而不是让默认值完成工作,例如 t = Test([]),Test 也不会在实例之间共享数据。

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

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

4

1 回答 1

2

http://effbot.org/zone/default-values.htm

于 2012-04-04T00:46:50.737 回答