数学运算符差异 *= 或 +=

Dan*_*iel 4 python pytorch

当我使用运算符例如*=或时,我发现了一件奇怪的事情+=

代码:

aa = Variable(torch.FloatTensor([[1,2],[3,4]]))
bb = aa
bb = bb*2
print(bb)
print(aa)

cc = Variable(torch.FloatTensor([[1,2],[3,4]]))
dd = cc
dd *= 2
print(cc)
print(dd)
Run Code Online (Sandbox Code Playgroud)

结果如下:

Variable containing:
 2  4
 6  8
[torch.FloatTensor of size 2x2]

Variable containing:
 1  2
 3  4
[torch.FloatTensor of size 2x2]

Variable containing:
 2  4
 6  8
[torch.FloatTensor of size 2x2]

Variable containing:
 2  4
 6  8
[torch.FloatTensor of size 2x2]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,当我使用时bb=bb*2aa没有受到影响。但是,如果使用dd *= 2,cc似乎指向(共享)与 相同的地址cc,则它会被更改。

它们各自的前一行是相同的,例如bb = aadd = cc。看来*=操作者将原来的深复制更改为浅复制,并且更改是在复制行本身之后进行的。

我想知道这是否是一个错误。如果是,那么它很重要,因为它会影响基本的数学运算。一般来说,我认为只使用内置的操作函数egtorch.add()是一个很好的解决方案。

OS: Mac OS X
PyTorch version: 3.0
How you installed PyTorch (conda, pip, source): conda
Python version: 3.6
CUDA/cuDNN version: None
GPU models and configuration: None
Run Code Online (Sandbox Code Playgroud)

*----------------------------------------

我理解dd *= 2是就地乘法,但是如何将值dd转移到cc?但如果我使用了dd = dd * 2,新值没有转移到cc?与上一行没有区别:dd = ccbb =aa。顺便说一句,在 python 中(不是 pytorch Variable 或 Tensor),dd *= 2两者dd = dd * 2都不会影响cc值。

sep*_*p2k 5

当您这样做时dd = ccddcc现在都是对同一对象的引用(与 相同bb = aa)。没有任何内容被复制!

当您这样做时bb = bb * 2*运算符会创建一个新对象,并且bb现在引用该对象。没有更改现有对象。

当您这样做时,引用的dd *= 2对象(以及也引用的对象)会发生更改。ddcc

因此,区别在于*创建一个新对象=并使变量引用一个新对象(而不是以任何方式更改该对象),而*=更改该对象。

x *= y其行为与 不同可能是违反直觉的x = x * y,但这些是语言的语义,而不是错误。