Хотя вы хотите, чтобы ваш код присваивал значение переменной новому объекту, ваш код интерпретируется по-разному:
Цитата из стандартной библиотеки python :
Операторы присваивания в Python не копируют объекты, они создают привязки между целью и объектом.Для коллекций, которые являются изменяемыми или содержат изменяемые элементы, иногда требуется копия, чтобы можно было изменить одну копию, не изменяя другую.Этот модуль предоставляет общие операции мелкого и глубокого копирования (объяснено ниже).
Я приведу пример со списками:
a
инициализируется как список с одним элементом, который имеет значение9:
In [1]: a = [9]
Теперь
In [2]: b = a
, хотя может показаться, что вы только что создали объект с тем же значением, что и a
, то, что эта строка кода делает в действительности,создать ссылку на объект same
.
Итак, присвоение нового значения первому элементу a
изменит базовый объект:
In [3]: a[0] = 1
И если новыйимя, которое вы дали этому объекту, называется, оно по-прежнему будет ссылаться на этот объект:
In [4]: b
Out[4]: [1]
Чтобы избежать нежелательного поведения, вы должны использовать copy
:
In [1]: import copy
In [2]: a = [9]
In [3]: b = copy.copy(a)
In [4]: a[0] = 1
In [5]: b
Out[5]: [9]
np.arrays
метод .copy (), который можно вызывать так, не импортируя копию:
a = np.array([1,2,3])
b = a.copy()