В первом случае и a
, и b
совместно используют одну и ту же память (т. Е. b
является представлением a
или, другими словами, b
указывает на значение (массив), где a
также указывает на), а аргумент out
гарантирует, что та же самая память a
будет обновлена после завершения операции np.add()
. В то время как во втором случае a
является новой копией, когда вы делаете a = a+1
, а b
все еще указывает на старое значение a
.
Попробуйте второй случай с:
a += 1
и обратите внимание, что и a
, и b
действительно обновлены.
In [7]: a = np.ones(5)
...: b = torch.from_numpy(a)
...: a += 1
In [8]: a
Out[8]: array([2., 2., 2., 2., 2.])
In [9]: b
Out[9]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
Как @ hpaulj удачно указал в его комментарии , когда мы делаем a = a+1
, создается новый объект и a
теперь будет указывать на этот новый (массив) объект вместо старого, на который все еще указывает b
. И по этой причине (массив) значение из b
не обновляется.
Чтобы понять это поведение немного лучше, вы можете обратиться к превосходной статье НедаBatchelder о как имена связываются со значениями в Python