创建新对象时,即使使用默认值也能保持数据

问题描述 投票:0回答:1

我很难理解为什么实例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-3.x default-value instance-variables class-variables
1个回答
0
投票

根据 在此

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)
© www.soinside.com 2019 - 2024. All rights reserved.