Python:*=的含义是什么?

13

在Python中,当使用*=时,这意味着什么。例如:

for i in xrange(len(files)):
    itimes[i,:,:] *= thishdr["truitime"]

@Luke Singham,我已经批准了你的编辑。在编辑时,请删除诸如“谢谢”之类的内容 - S.L. Barth
3个回答

15

正如其他人所解释的那样,这大致相当于:

[object] = [object] * [another_object]

然而,这并不完全相同。从技术上讲,上述调用了__mul__函数,该函数返回一个值,并将其重新赋值给名称。

例如,我们有一个对象A并将其与B相乘。 这个过程大致如下:

> Call the __mul__ function of object A, 
> Retrieve the new object returned.
> Reassign it to the name A.

看起来很简单。现在,通过执行*=,我们不是调用方法__mul__,而是__imul__,它会尝试修改自身。该过程大致如下:

> Call the __imul__ function of object A,
> __imul__ will change the value of the object, it returns the modified object itself
> The value is reassigned back to the name A, but still points to the same place in memory.

通过这种方式,您正在就地修改它,而不是创建新对象。

那又怎样?看起来一样啊...

并非完全相同。如果您替换了一个对象,则为其在内存中创建了一个新位置。如果您就地修改它,则该对象在内存中的位置始终相同。

看一下这个控制台会话:

>>> a = [1, 2, 3]
>>> b = a
>>> c = 10
>>> a = a * c
>>> print a
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> b
[1, 2, 3]

如果我们检查内存地址:

>>> id(a) == id(b)

使用这个操作,b的值不会改变,因为a现在只是指向了不同的位置。但是使用*=

>>> a = [1, 2, 3]
>>> b = a
>>> c = 10
>>> a *= c
>>> b
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]

如果我们检查内存地址:

>>> id(a) == id(b)
True

这个操作同样会影响 b。有时候这可能会导致困惑和混乱的行为,但一旦你理解了它,处理起来就会变得容易。

希望这可以帮到你!


__imul__ 返回它的结果(通常是 self),并且该结果 被赋值回变量。 - lvc
现在,我很困惑。结果发现我知道的比我想象的还要少。@lvc 你能帮我理解一下吗?实际上有什么区别?同时,我会删除我的回答。你能来聊天室吗? - aIKid
啊,等等,我想我明白了。 - aIKid

9

这只是表示“[左侧表达式] = [它本身] * [右侧表达式]”:

itimes[i,:,:] *= thishdr["truitime"]

等同于

itimes[i,:,:] = itimes[i,:,:] * thishdr["truitime"]


14
严格来说,它调用左侧的 __imul__ 方法,这个方法可能会执行任何操作。 - Marcin
如果左侧实现了原地版本,则尝试原地执行乘法。 - user2357112
1
еРМж†ЈеЬ∞пЉМ+=, -=, /=, //= &=, |=, <<=, **=, >>=, еТМ ^= ињЩдЇЫињРзЃЧзђ¶еЇФиѓ•жМЙзЕІдљ†жЙАжЬЯжЬЫзЪДжЦєеЉПжЙІи°МпЉМеЙНжПРжШѓдљ†жЬЙеРИзРЖзЪДеЃЪдєЙ __imul__, __iadd__ з≠ЙжЦєж≥ХгАВ - vroomfondel
@MikeMcMahon 那么...我不应该告诉别人吗?你的意思是什么? - Marcin
表现应该是这样的,而不是“可以做任何事情”。 - Mike McMahon
显示剩余6条评论

1
这句话的意思是:“将此变量设置为其自身乘以”。
>>> fred = 10
>>> fred *= 10                                                                                                                                                                                                                              
>>> fred                                                                                                                                                                                                                                    
100                                                                                                                                                                                                                                         
>>> barney = ["a"]                                                                                                                                                                                                                            
>>> barney *= 10                                                                                                                                                                                                                              
>>> barney 
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']                                                                                                                                                                                          

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接