在Python中,使用*=
时的含义是什么。例如:
for i in xrange(len(files)):
itimes[i,:,:] *= thishdr["truitime"]
答案 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']