Pregunta Python: ¿Qué significa * =?


En Python, ¿qué significa cuando *= es usado. Por ejemplo:

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

5
2017-12-16 23:13


origen


Respuestas:


Simplemente significa "[expresión a la izquierda] = [en sí] * [expresión a la derecha]":

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

es equivalente a

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


8
2017-12-16 23:14



Como otros han explicado, esto es más o menos equivalente a:

[object] = [object] * [another_object]

Sin embargo, no es exactamente lo mismo. Técnicamente, lo anterior llama al __mul__ función, que devuelve un valor, y volver a asignarlo al nombre.

Por ejemplo, tenemos un objeto A y multiplicándolo con B. El proceso es algo así:

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

Parece simple. Ahora, haciendo *= no estamos invocando el método __mul__, pero en lugar __imul__, que intentará modificarse. El proceso es algo así:

> 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.

Con esto, lo estás modificando en el lugar, no creando un nuevo objeto.

¿Y qué? Se ve igual ...

No exactamente. Si reemplaza un objeto, creó un nuevo lugar para él en la memoria. Si lo modifica en el lugar, la ubicación del objeto en la memoria siempre será la misma.

Echa un vistazo a esta sesión de consola:

>>> 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]

Si revisamos la dirección de la memoria:

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

Falso

Usando esto, el valor de b no ha cambiado, ya que a ahora solo señala un lugar diferente. Pero usando *=:

>>> 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]

Y si comprobamos la dirección de memoria:

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

La operación afecta b también. Esto puede ser complicado y llevar a comportamientos confusos, a veces. Pero una vez que lo entiendas, sería fácil de manejar.

¡Espero que esto ayude!


4
2017-12-17 00:06



Significa "configurar esta variable para sí mismo"

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

0
2017-12-16 23:18