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
上述两个例子之间的区别是什么?
答案 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