当我使用运算符例如*=
或时,我发现了一件奇怪的事情+=
代码:
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*2
,aa
没有受到影响。但是,如果使用dd *= 2
,cc
似乎指向(共享)与 相同的地址cc
,则它会被更改。
它们各自的前一行是相同的,例如bb = aa
和dd = 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 = cc
和bb =aa
。顺便说一句,在 python 中(不是 pytorch Variable 或 Tensor),dd *= 2
两者dd = dd * 2
都不会影响cc
值。
当您这样做时dd = cc
,dd
和cc
现在都是对同一对象的引用(与 相同bb = aa
)。没有任何内容被复制!
当您这样做时bb = bb * 2
,*
运算符会创建一个新对象,并且bb
现在引用该对象。没有更改现有对象。
当您这样做时,引用的dd *= 2
对象(以及也引用的对象)会发生更改。dd
cc
因此,区别在于*
创建一个新对象=
并使变量引用一个新对象(而不是以任何方式更改该对象),而*=
更改该对象。
x *= y
其行为与 不同可能是违反直觉的x = x * y
,但这些是语言的语义,而不是错误。
归档时间: |
|
查看次数: |
772 次 |
最近记录: |