为什么a的ID没有变?

Why hasn't a's ID changed?

a = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
b = torch.tensor([5.0, 5.0, 5.0])
los = sum(a*b)
los.backward()
print(id(a.grad))
a.grad = torch.tensor([1., 2., 3.])
print(id(a.grad))

输出:

2792503915000
2792503915000

为什么 a.grad 的 ID 没有改变?

Python 的 id() 只是 returns 对象的唯一编号。生命周期不重叠的对象ID可以相同;也就是说,当一个对象被销毁,然后创建一个新对象时,新对象可以与上一个对象具有相同的 ID。 Python 对象 ID 通常与 C 中的内存地址进行比较,并且(显然)在某些 python 实现中,它们 只是内存地址。

例如,考虑以下片段:

class a:
    pass

my_a = a()
print(id(my_a))
my_a = a()
print(id(my_a))
my_a = a()
print(id(my_a))

对于我的特定 python 实现,示例输出是:

139647922983888
139647922986768
139647922983888

第三次重复第一个ID;这是 id() api.

允许的