gpt4 book ai didi

python - 数学运算符区别 *= 或 +=

转载 作者:太空狗 更新时间:2023-10-30 02:53:30 26 4
gpt4 key购买 nike

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

代码:

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)

结果如下:

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]

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

他们各自的前一行是相同的,例如bb = aadd = cc。似乎 *= 运算符将原始深拷贝更改为浅拷贝,并且更改是在复制行本身之后进行的。

我想知道这是不是一个错误。如果是,这很重要,因为它会影响基本的数学运算。通常,我认为只需使用内置的操作功能,例如torch.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

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

我理解dd *= 2 是就地乘法,但是dd 的值如何转换为cc?但是如果我使用dd = dd * 2,新值没有传输到cc?上一行没有区别:dd = ccbb =aa。顺便说一句,在 python 中(不是 pytorch 变量或张量),dd *= 2dd = dd * 2 都不会影响 cc 值。

最佳答案

当您执行 dd = cc 时,ddcc 现在都是对同一对象的引用(对于 bb = aa).没有任何内容被复制!

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

当您执行 dd *= 2 时,dd 引用的对象(以及 cc 也引用的对象)被更改。

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

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

关于python - 数学运算符区别 *= 或 +=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49321725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com