我很难理解为什么实例C会保留实例B的数据,即使我用默认的空列表初始化了实例变量var。为什么默认参数 "var = []"会被忽略?
class A():
def __init__(self, var=[]):
self.var = var
B = A()
B.var.append(3)
C = A()
print(C.var)
打印的结果是
[3]
更奇怪的是
class A():
def __init__(self, var=[2]):
self.var = var
B = A()
B.var.append(3)
C = A()
print(C.var)
印花
[2, 3]
怎么会有这样的说法呢?self.var = var
从前面追加到列表中?
根据 在此
Python 变量是一个符号名称,它是一个对象的引用或指针。一旦一个对象被分配给一个变量,你就可以用这个名字来引用这个对象。但数据本身仍然包含在对象中。
B = A()
B.var.append(3)
在这里,A的引用被传递给了B,所以它们指向的是同一个数据,只是调用的名称不同。所以,无论你对B执行什么操作,你也会对A执行。
因此,以后当你把A分配给C时,同样的数据也被C引用了。
如果你不想发生这种情况,可以使用deepcopy。
class A():
def __init__(self, var=[]):
self.var = var
import copy
B = copy.deepcopy(A())
B.var.append(3)
C = A()
print(C.var)