Это на самом деле не имеет ничего общего с PyTorch. Сравнить
import numpy as np
a = np.ones(5)
b = a
, за которым следует либо
np.add(a, 1, out=a)
print(b)
или
a = a + 1
print(b)
Существует разница между np.add(a, 1, out=a)
и a = a + 1
. В первом случае вы сохраняете один и тот же объект (массив) a
с разными значениями (2
вместо 1
); в последнем случае вы получаете массив new , который связан с тем же именем переменной a
и имеет значения 2
. Тем не менее, «оригинал» a
отбрасывается и, если что-то еще (b
) не указывает на него, будет освобождено. Другими словами, первая операция на месте, а вторая - не на месте. Поскольку b
сохраняется в массиве, изначально найденном в a
, переназначение a + 1
в a
не влияет на значение b
. Альтернативный синтаксис мутации на месте будет
a[:] = a + 1
print(b)
Что касается PyTorch, все очень просто. from_numpy
создает тензор, который создает псевдоним реального объекта (массива), поэтому он эквивалентен строке b = a
в моем первом фрагменте. Тензор будет отслеживать изменения в массиве с именем a
в точке вызова, а не изменения того, на что указывает имя a
.