Обязательно ли использовать copy внутри классов, чтобы избежать перезаписи предыдущих переменных? - PullRequest
0 голосов
/ 30 мая 2018

Я пишу простой класс, который имеет фазу инициализации в зависимости от некоторой переменной, он перезаписывает предыдущую переменную.

Строго необходимо делать копию при вводе данных, чтобы не перезаписывать переменную?

В качестве примера:

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 голосов
/ 30 мая 2018

Ваш Trial.B имел указатель на Input, и вы изменили указатель на 'Hello'.

Во втором примере вы получили доступ к данным, на которые указывает Trial.B, и изменили их.

Если бы вы тестировали Input и Trial.B, используя:

Trial.B is Input
#True

Вы получите эти результаты, которые указывают, что оба указывают на один и тот же объект.

...