是否有必要在类中使用copy来避免覆盖以前的变量?

时间:2018-05-30 12:29:01

标签: arrays class numpy python-3.5

我编写了一个简单的类,它具有一个初始化阶段,取决于某个变量,它会覆盖前一个变量。

在提供输入时是否必须制作副本才能不覆盖变量?

举例说明:

import numpy as np
Input = np.array([ [0,1], [1,1] ])
class A:
    def __init__(self, I):
        self.B = I

当我写:

Trial = A(Input)
Trial.B

它正确地给出了:

array[[0,1]
      [1,1]]

如果我想进行彻底的更改,例如:

Trial.B = 'Hello'

不会更改输入。但是,如果我重复这一切直到这一点,现在我们写下而不是这个改变另一个像:

Trial.B[0] = 2

现在,如果我要求输入,它会给出:

np.array([[2,2]
          [1,1]])

现在它已经改变了变量Input!

为什么会这样?我必须总是写:

class A:
    def __init__(self, I):
        self.B = I.copy()

为了不弄乱变量?为什么只有当变化的数据类型与变量中的数据相同时才会弄乱它?

感谢。

1 个答案:

答案 0 :(得分:1)

您的Trial.B指针指向Input并且您将指针更改为'Hello'

在第二个示例中,您访问了Trial.B指向并更改它的数据。

如果您使用以下方式测试InputTrial.B

Trial.B is Input
#True

你会得到这个结果,表明两者都指向同一个对象。