3
class Entry():
    def __init__(self,l=[]):
        self.list = l


a = Entry()
b = Entry()
a.list.extend([1,2])
assert a.list!=b.list   #assert error

如果使用

a = Entry([])
b = Entry([])
a.list.extend([1,2])
assert a.list!=b.list   #right

以上两个例子有什么区别?

4

3 回答 3

2

参考:“Least Astonishment”和可变默认参数

但是要解决您的问题,请执行以下操作:

def __init__(self,l=None):
    self.list = l if l else []

或者,正如编辑所建议的那样(应该是评论)。你可以使用or

def __init__(self, l=None):
    self.list = l or []
于 2013-10-21T14:59:45.450 回答
1

不要[]用作默认参数。

用这个:

class Entry():
    def __init__(self,l=list()):
        ...

这里的问题是相同的列表被分配给每个 Entry 实例。

那么追加是这样的:

lst = []
a = Entry(lst)
b = Entry(lst)

a.list == b.list # lst == lst -> True
于 2013-10-21T14:58:39.233 回答
1

这是因为在第一种情况下,您传递了一个默认参数 [ ],它引用了相同的列表对象。

    class Entry():
        def __init__(self,l=[]):
        self.list = l

    a = Entry()
    b = Entry()
    a.list.extend([1,2])
    print a.list, b.list # [1, 2] [1, 2]
    print id(a.list), id(b.list) # 36993344 36993344
于 2013-10-21T15:00:21.437 回答