python构造函数默认参数列表

时间:2013-12-04 02:26:09

标签: python

默认参数列表是否为所有实例的相同对象?

    class X():
      def __init__(self,a=[]):
        self.member=a   
        print id(a)

    k=X([1,2,3])
    g=X([1,2,3])
    t=X()
    h=X()

输出令我惊讶:

    140072782781832
    140072782901976
    140072782816536
    140072782816536

正如您所看到的,当a等于[1,2,3]时,id是不同的,但当a为空时,id保持不变。但是,如果我删除self.member,现在代码如下所示:

    class X():
      def __init__(self,a=[]):
        print id(a)

    k=X([1,2,3])
    g=X([1,2,3])
    t=X()
    h=X()

输出如下:

    140033294171528
    140033294171528
    140033294206232
    140033294206232

当等于[1,2,3]时,id保持不变。

我完全糊涂了......任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

是的,这就是你应该做的原因

class X():
    def __init__(self, a=None):
        self.a = [] if a is None else a

修改

我会指出

class X():
    def __init__(self,a=[]):
        print(id(a))

k = X([1,2,3])
g = X([1,2,4])   # <- different list values
t = X()
h = X()

也给出了

42678232
42678232
42680152
42680152

所以我希望答案是“如果你创建一个列表,删除它,并创建另一个列表,那么它将重用相同的分配内存位置的可能性很大”。