我的问题是为什么默认参数不能用于区分不同的对象。
如果我将类M1定义为:
class M1:
id = -1
list1 = []
def __init__(self,id,list1 = []):
self.id = id
self.list1 = list1
def insertList(self,element):
self.list1.append(element)
并使用它:
if __name__ == '__main__':
m1 = M1(1,[])
m1.insertList("a",[])
m1.insertList("b",[])
m2 = M1(2,[])
print m2.list1
它将[]返回为m2.list1,因为list1不在m1和m2之间共享。
但是,如果我在定义M1对象时'信任'默认参数,如下所示:
if __name__ == '__main__':
m1 = M1(1)
m1.insertList("a",[])
m1.insertList("b",[])
m2 = M1(2)
print m2.list1
它将返回['a','b']为m2.list1,list1在不同对象之间共享。
我知道类参数可以根据它是否在__init__(self)
中定义而定义为静态或对象成员,但为什么默认参数会影响结果?
答案 0 :(得分:3)
这与列表是可变的,一流的对象有关(参见"Least Astonishment" and the Mutable Default Argument)。如果你这样做,它将起作用:
def __init__(self, id, list1=None):
if list1 is None:
self.list1 = []
函数体内的赋值将刷新变量。