在Python中,当使用*=
时,这意味着什么。例如:
for i in xrange(len(files)):
itimes[i,:,:] *= thishdr["truitime"]
在Python中,当使用*=
时,这意味着什么。例如:
for i in xrange(len(files)):
itimes[i,:,:] *= thishdr["truitime"]
正如其他人所解释的那样,这大致相当于:
[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这只是表示“[左侧表达式] = [它本身] * [右侧表达式]”:
itimes[i,:,:] *= thishdr["truitime"]
等同于
itimes[i,:,:] = itimes[i,:,:] * thishdr["truitime"]
__imul__
方法,这个方法可能会执行任何操作。 - Marcin+=
, -=
, /=
, //=
&=
, |=
, <<=
, **=
, >>=
, еТМ ^=
ињЩдЇЫињРзЃЧзђ¶еЇФиѓ•жМЙзЕІдљ†жЙАжЬЯжЬЫзЪДжЦєеЉПжЙІи°МпЉМеЙНжПРжШѓдљ†жЬЙеРИзРЖзЪДеЃЪдєЙ __imul__
, __iadd__
з≠ЙжЦєж≥ХгАВ - vroomfondel>>> fred = 10
>>> fred *= 10
>>> fred
100
>>> barney = ["a"]
>>> barney *= 10
>>> barney
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']