在__init__中使用空列表作为默认参数,为什么所有实例中的列表都引用相同的列表?

时间:2013-10-21 14:55:42

标签: python python-2.7

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

上述两个例子之间的区别是什么?

3 个答案:

答案 0 :(得分:0)

请勿使用[]作为默认参数。

使用此:

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

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

所以追加是这样的:

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

a.list == b.list # lst == lst -> True

答案 1 :(得分:0)

咨询:"Least Astonishment" and the Mutable Default Argument

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

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

答案 2 :(得分:0)

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

    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