You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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])

    1. a = mat[0,0]:此时a指向mat中(0,0)位置的0维张量,相当于关联了mat对应位置的数据。
    2. a = torch.tensor([99]):这一步是重新给变量a赋值,让它指向一个全新创建的张量,完全切断了和mat的关联。全程没修改mat内存里的内容,所以mat不会变化。
  • 第二种操作:row = mat[0,:]; row[0] = torch.tensor([99])

    1. row = mat[0,:]:PyTorch对张量做切片(比如取整行)时,返回的是原张量的视图(View)——视图和原张量共享同一块内存空间,只是维度或访问方式不同。
    2. row[0] = torch.tensor([99]):这一步是修改视图对应位置的内存值,因为视图和mat共享内存,所以mat中对应的位置也会被同步修改。

简单总结:前者是替换了变量指向的对象,后者是直接修改了共享内存里的数据。

内容的提问来源于stack exchange,提问作者puddles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:55:01