【发布时间】:2020-02-07 03:23:36
【问题描述】:
我有两个相当简单的代码给出不同的答案。我知道这是由于共享的参考,但我不太清楚第二种情况到底发生了什么
a = np.ones(5)
b = torch.from_numpy(a)
a=np.add(a, 1, out=a)
print(a)
print(b)
[出]:
[2. 2. 2. 2. 2.]
张量([2., 2., 2., 2., 2.], dtype=torch.float64)
a = np.ones(5)
b = torch.from_numpy(a)
a=a+1
print(a)
print(b)
[出]:
[2. 2. 2. 2. 2.]
张量([1., 1., 1., 1., 1.], dtype=torch.float64)
为什么b在第二种情况下不改变?
【问题讨论】:
-
使用
out=a可确保将新值写入原始a对象。使用a = a+1,结果是一个新数组,它不再与用于创建b的a对象有任何联系。这是基本的 Python 行为。一些操作就地修改对象,其他操作创建一个新对象。a=....将新对象分配给变量a;它不会修改之前分配给它的对象。 -
@hpaulj 感谢您的出色见解!我已经在我的回答中链接了 Ned Batchelder 的演讲,其中也有一些关于这种行为的视觉说明:)
标签: python-3.x numpy reference pytorch numpy-ndarray