我听说过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也应该更改。但它没有
有人可以解释一下原因吗?
答案 0 :(得分:1)
修改变量指向的对象与重新分配变量本身之间存在差异。
考虑A = [1, 2, 3]
。现在,设置B = A
意味着A
和 B
都指向内存中的相同的对象。请记住,A
和B
只是引用,除了它们指向内存中的同一对象之外,它们之间没有任何关联。
现在,如果您要执行A[0] = 999
,那么您可以打印B[0]
并看到正在显示的999
,因为它们仍然指向同一个对象。但是,如果您设置A = [4, 5, 6]
,那么这对B
没有任何影响,[999, 2, 3]
仍然指向var answers = ctx.Answers
.Select(a => new AnswerViewModel
{
AnswerId = a.AnswerId,
AnswerText = a.AnswerText,
AnswerTypeName = a.AnswerType.Name, // For example, getting values from child references...
}).ToList();
。
有关详细信息(和图片!),我建议在变量名称和参考文献中提及SO退伍军人Ned Batchelder的HOWTO。