Python, mutable object as default argument, is there any way to solve?
1 2 3 4 5 6 7 8 9 10 | class A: def __init__(self, n=[0]): self.data = n a = A() print a.data[0] #print 0 a.data[0] +=1 b = A() print a.data[0] #print 1, desired output is 0 |
在上面的例子中,有没有任何方法可以提供一个默认参数,其中的可变对象(如列表或类)在uuinit_uuuu()类A中,但B不受操作A的影响?
你可以试试这个:
1 2 3 4 5 | class A: def __init__(self, n=None): if n is None: n = [0] self.data = n |
这avoids面临的最大的问题是,"你,是的,这是每一个单一的对象相同的名单是你的"A"型
一个可能性是:
1 2 3 4 5 | class A: def __init__(self, n=None): if n is None: n = [0] self.data = n |
还有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class A: def __init__(self, n=[0]): print id(n) self.data = n[:] print id(self.data) del n a = A() print a.data[0] #prints 0 a.data[0] +=1 print a.data[0] #prints 1 b = A() print b.data[0] #prints desired output 0 |
这是一个原则的扩展列表。如果该列表是通过长的参数列表,将有两个长的内存中。这是操作系统的另一个inconvenience创建列表。这就是为什么我删除。
认为这是更好的,但它可能给你的理解所发生