我正在经历一些 Python 活动,并获得了带有此运算符的示例代码:y *= -1
我查看了相关的 Python 文档,但无济于事。
y += 1
例如,我知道是 的缩写y = y + 1
。那么这个y = y * -1
y 可能等于 y 乘以 -1 吗?
我能找到的 Python 文档中最接近的内容是::x * y
x和 y 的乘积
是这个吗?
我正在经历一些 Python 活动,并获得了带有此运算符的示例代码:y *= -1
我查看了相关的 Python 文档,但无济于事。
y += 1
例如,我知道是 的缩写y = y + 1
。那么这个y = y * -1
y 可能等于 y 乘以 -1 吗?
我能找到的 Python 文档中最接近的内容是::x * y
x和 y 的乘积
是这个吗?
在绝大多数情况下
y *= <expr>
是相同的
y = y * <expr>
但在一般情况下,它被解释为:
y = imul(y, <expr>)
这相当于:
y = y.__imul__(<expr>)
ify
的类型覆盖__imul__
。
这意味着 ify
的类型覆盖了就地乘法运算符,就地y*=<expr>
执行,而不是。y=y*<expr>
编辑
可能不会立即清楚为什么需要分配,即为什么它被解释为y = imul(y, <expr>)
,而不仅仅是imul(y, <expr>)
。
原因是以下两种情况给出相同的结果是很有意义的:
c = a * b
和
c = a
c *= b
现在,如果a
并且b
属于相同类型(例如浮点数、numpy 数组等),这当然可以工作,但如果它们不是,则操作的结果可能具有 的类型b
,在这种情况下操作不能是 的就地操作a
,因此需要将结果分配给a
,以实现正确的行为。
例如,这工作,感谢分配:
from numpy import arange
a = 2
a *= arange(3)
a
=> array([0, 2, 4])
而如果分配被删除,则a
保持不变:
a = 2
imul(a, arange(3))
=> array([0, 2, 4])
a
=> 2
对,那是正确的。它只是意味着将左侧值乘以右侧值的负数。它们都是算术运算符,仅在操作和表达式绑定方面有所不同,因此我相信 +/* 在重载中的其他任何地方都是并行的。
y = y * -1