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

PyTorch中连续调用id(tensor[x][y])为何得到不同结果?

为啥PyTorch张量索引的id会不一样?

先看你给出的代码示例:

x=torch.rand(3,3)
id(x[0][0])
1186163119824
id(x[0][0])
1186163118464
id(x[0,0])
1186163118464
id(x[0,0])
1186163118464

这不是id()函数的bug,完全是PyTorch张量的索引机制和Python列表差异导致的:

  • 对于x[0][0]这种链式索引:
    第一次调用时,x[0]会返回一个共享原张量数据的新视图对象,接着对这个视图取[0],又生成一个新的0维张量对象。每次执行x[0][0],都会重复这个“生成临时视图→生成临时元素对象”的过程,两次生成的对象是完全独立的,所以它们的内存地址(也就是id()返回的值)不一样。而且这些临时对象用完就会被Python回收,内存地址可以被后续新对象复用。

  • 对于x[0,0]这种逗号分隔的索引:
    这是PyTorch原生的高级索引语法,它会直接从原张量中定位到目标元素,不会生成中间的临时视图。PyTorch内部对这种索引做了优化,每次调用返回的是同一个0维张量对象,所以两次id()返回的结果一致。

总结下:Python列表的索引是直接返回元素的内存引用,而PyTorch的链式索引每次都会产生临时张量对象,而逗号索引是一次性定位,返回的对象更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:42:06