Python:* =是什么意思?

时间:2013-12-16 23:13:46

标签: python

在Python中,使用*=时的含义是什么。例如:

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

3 个答案:

答案 0 :(得分:7)

它只是意味着“[表达在左边] = [本身] * [表达在右边]”:

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

相当于

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

答案 1 :(得分:5)

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

[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。这可能很棘手,有时会导致令人困惑的行为。但是一旦你理解了它,就很容易处理。

希望这有帮助!

答案 2 :(得分:0)

这意味着“将此变量设置为自身时间”

>>> fred = 10
>>> fred *= 10                                                                                                                                                                                                                              
>>> fred                                                                                                                                                                                                                                    
100                                                                                                                                                                                                                                         
>>> barney = ["a"]                                                                                                                                                                                                                            
>>> barney *= 10                                                                                                                                                                                                                              
>>> barney 
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']