7

我正在经历一些 Python 活动,并获得了带有此运算符的示例代码:y *= -1

我查看了相关的 Python 文档,但无济于事。

y += 1例如,我知道是 的缩写y = y + 1。那么这个y = y * -1y 可能等于 y 乘以 -1 吗?

我能找到的 Python 文档中最接近的内容是::x * yx和 y 的乘积

是这个吗?

4

2 回答 2

12

在绝大多数情况下

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
于 2013-05-22T05:01:31.683 回答
3

对,那是正确的。它只是意味着将左侧值乘以右侧值的负数。它们都是算术运算符,仅在操作和表达式绑定方面有所不同,因此我相信 +/* 在重载中的其他任何地方都是并行的。

y = y * -1
于 2013-05-22T04:54:32.893 回答