PyTorch张量引用与值传递:为何两段代码表现不同?
两种张量赋值操作的差异原因
先看你给出的代码示例:
>>> mat = torch.ones(2,3); print(mat) tensor([[1., 1., 1.], [1., 1., 1.]]) >>> a = mat[0,0] >>> a = torch.tensor([99]); print(mat) tensor([[1., 1., 1.], [1., 1., 1.]]) >>> row = mat[0,:] >>> row[0] = torch.tensor([99]); print(mat) tensor([[99., 1., 1.], [ 1., 1., 1.]])
差异的核心在于变量赋值的本质和PyTorch索引返回的对象类型:
第一种操作:
a = mat[0,0]; a = torch.tensor([99])a = mat[0,0]:此时a指向mat中(0,0)位置的0维张量,相当于关联了mat对应位置的数据。a = torch.tensor([99]):这一步是重新给变量a赋值,让它指向一个全新创建的张量,完全切断了和mat的关联。全程没修改mat内存里的内容,所以mat不会变化。
第二种操作:
row = mat[0,:]; row[0] = torch.tensor([99])row = mat[0,:]:PyTorch对张量做切片(比如取整行)时,返回的是原张量的视图(View)——视图和原张量共享同一块内存空间,只是维度或访问方式不同。row[0] = torch.tensor([99]):这一步是修改视图对应位置的内存值,因为视图和mat共享内存,所以mat中对应的位置也会被同步修改。
简单总结:前者是替换了变量指向的对象,后者是直接修改了共享内存里的数据。
内容的提问来源于stack exchange,提问作者puddles
相关产品推荐
相关产品推荐

