gpt4 book ai didi

python - 类对象上的赋值和深层复制之间的区别

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:11 25 4
gpt4 key购买 nike

我听说过Python中浅拷贝和赋值的区别,

“浅拷贝构造一个新对象,而赋值只是将新变量指向现有对象。对现有对象的任何更改都会影响这两个变量(带赋值)”

在下面的示例中,我有一个包含 2 个变量的类:train_data 和 train_labels。

class test(object):


def __init__(self, train_data, train_labels):
self.train_data = train_data
self.train_labels = train_labels

def fit(self, train_data, train_labels):
self.train_data = train_data
self.train_labels = train_labels

我创建了一个类对象,获取类对象A的train_data作为initial_train_data。然后将类对象A的train_data改为[1,2,3]。最后,我再次检查了initial_train_datavariable:

A = test([1,2,3,4,5], ['a','b','c','d','e'])
initial_train_data = A.train_data
>>> A.train = [1,2,3,4,5]
A.train_data = [1,2,3]
>>> A.train = [1,2,3]
print(initial_train_data)
>>> initial_train_data = [1,2,3,4,5]

我很困惑,我认为:initial_train_data = A.train_data,我只是将A.train_data的内存位置分配给initial_train_data,当我更改A.train_data时,initial_train_data也应该更改。但事实并非如此

谁能给我解释一下原因吗?

最佳答案

修改变量指向的对象和重新分配变量本身是有区别的。

考虑A = [1, 2, 3]。现在,设置 B = A 意味着 A B 都指向相同 内存中的对象。请记住,AB 只是引用,除了它们指向内存中的同一对象之外,彼此之间没有任何关系。

现在,如果您要执行 A[0] = 999,那么您可以打印 B[0] 并看到相同的 999 code> 被显示,因为它们仍然指向同一个对象。但是,如果您设置 A = [4, 5, 6],则对 B 没有影响,它仍然指向 [999, 2, 3].

有关更多详细信息(和图片!),我建议引用 SO 老兵 Ned Batchelder 的 HOWTO关于变量名称和引用。

关于python - 类对象上的赋值和深层复制之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47006148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com