为何使用aray +=1与aray=aray+1时PyTorch Tensor的变化不同?
import torch import numpy as np aray = np.arange(1, 11) tensor = torch.from_numpy(aray) print(f"aray: {aray}, \ntensor: {tensor}\n\n\n") aray = 1 + aray print(f"aray + 1: {aray}, \ntensor: {tensor}")
问题
我在执行aray += 1操作时,发现关联的PyTorch Tensor变量同步改变,但执行aray = aray + 1时Tensor无变化,请问原因是什么?
原因解析
- 核心前提:
torch.from_numpy()创建的Tensor会和原NumPy数组共享内存空间,两者指向同一块物理内存,内存里的数据变化会被双方同时感知。 - 两种操作的本质差异:
aray += 1是原地修改操作:它直接在原数组占用的内存空间里修改数值,没有创建新的数组对象。因为Tensor和原数组共享内存,所以Tensor会同步显示修改后的值。aray = aray + 1是新对象赋值操作:aray + 1会生成一个全新的NumPy数组,之后把这个新数组的引用赋值给变量aray。此时原来的数组内存完全没被改动,而Tensor依然指向原来的那块内存,所以Tensor的值不会发生变化。
可以通过打印内存地址验证这个逻辑:
import torch import numpy as np aray = np.arange(1, 11) print(f"原aray内存地址: {id(aray)}") tensor = torch.from_numpy(aray) aray += 1 print(f"aray +=1后地址: {id(aray)}") # 地址和原地址一致,还是同一个对象 aray = aray + 1 print(f"aray = aray+1后地址: {id(aray)}") # 地址改变,是新创建的对象
内容的提问来源于stack exchange,提问作者Igor czerbniak
相关产品推荐
相关产品推荐

