为什么默认参数不适用于Python对象区分

时间:2014-05-11 15:02:27

标签: python

我的问题是为什么默认参数不能用于区分不同的对象。

如果我将类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)中定义而定义为静态或对象成员,但为什么默认参数会影响结果?

1 个答案:

答案 0 :(得分:3)

这与列表是可变的,一流的对象有关(参见"Least Astonishment" and the Mutable Default Argument)。如果你这样做,它将起作用:

def __init__(self, id, list1=None):
    if list1 is None:
        self.list1 = []

函数体内的赋值将刷新变量。