Python,可变对象作为默认参数,有什么方法可以解决?

时间:2011-09-21 15:14:16

标签: python class object mutable

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

在上面的例子中,有没有办法在__init __() A类中提供与可变对象(如列表或类)的默认参数,但是 b 不受操作 a

的影响

3 个答案:

答案 0 :(得分:7)

你可以试试这个:

class A:
   def __init__(self, n=None):
       if n is None:
         n = [0]
       self.data = n

这避免了您在这里遇到的最大问题,也就是说,对于您的类型“A”的每个单个对象,它都是相同的列表。

答案 1 :(得分:4)

一种可能性是:

class A:
    def __init__(self, n=None):
        if n is None:
            n = [0]
        self.data = n

答案 2 :(得分:0)

此外:

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

print

b = A()
print b.data[0] #prints desired output  0

原则是它创建了另一个列表。如果将长列表作为参数传递,则内存中将有两个长列表。所以不便之处是它创建了另一个列表......这就是我删除 n 的原因。

不要认为它更好,但它可以让你理解发生的事情