我正在进行一些Python活动,并使用此运算符给出了示例代码:y *= -1
我查看relevant Python docs,但无济于事。
我知道y += 1
例如是y = y + 1
的缩写。那么y = y * -1
y等于y乘以-1可能吗?
我能找到的Python文档中最接近的一点是:x * y
: x和y的产品
答案 0 :(得分:12)
在绝大多数情况下
y *= <expr>
与
相同y = y * <expr>
但在一般情况下,它被解释为:
y = imul(y, <expr>)
然后相当于:
y = y.__imul__(<expr>)
如果y
的类型覆盖__imul__
。
这意味着,如果y
的类型会覆盖 inplace 乘法运算符,则y*=<expr>
将执行 inplace ,而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
答案 1 :(得分:3)
是的,这是正确的。它只是意味着将左手值乘以右手值。它们都是算术运算符,只是通过操作和表达式绑定而不同,所以我相信+ / *在重载中的其他地方都是并行的。
y = y * -1