类对象

时间:2017-10-29 23:02:25

标签: python class

我听说过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也应该更改。但它没有

有人可以解释一下原因吗?

1 个答案:

答案 0 :(得分:1)

修改变量指向的对象与重新分配变量本身之间存在差异。

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

现在,如果您要执行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