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 ?
的影响答案 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 的原因。
不要认为它更好,但它可以让你理解发生的事情