在绝大多数情况下
y *= <expr>
是相同的
y = y * <expr>
但在一般情况下,它解释为:
y = imul(y, <expr>)
这等效于:
y = y.__imul__(<expr>)
如果
y的类型覆盖
__imul__。
这意味着if
y的类型将覆盖 inplace 乘法运算符,
y*=<expr>则在 inplace
中执行,而
y=y*<expr>在not中执行。
编辑
可能尚不清楚为什么需要分配,即为什么将其解释为
y = imul(y, <expr>),而不仅仅是
imul(y, <expr>)。
原因是在以下两种情况下得出相同的结果非常有意义:
c = a * b
和
c = ac *= b
现在,如果
a和
b属于相同类型(例如,浮点数,numpy数组等),这当然可以工作,但是如果不相同,则运算结果可能具有的类型
b,在这种情况下操作不能是的就地操作
a,因此需要将结果分配给
a,以实现正确的行为。
例如,这要感谢分配:
from numpy import arangea = 2a *= arange(3)a=> array([0, 2, 4])
而如果分配被放弃,则
a保持不变:
a = 2imul(a, arange(3))=> array([0, 2, 4])a=> 2



