Necesito saber qué + = hace en Python. Es así de simple. También agradecería enlaces a definiciones de otras herramientas de mano corta en Python.
Necesito saber qué + = hace en Python. Es así de simple. También agradecería enlaces a definiciones de otras herramientas de mano corta en Python.
Respuestas:
En Python, + = es una capa de azúcar para el __iadd__
método especial, __add__
o __radd__
si __iadd__
no está presente. El __iadd__
método de una clase puede hacer lo que quiera. El objeto de lista lo implementa y lo usa para iterar sobre un objeto iterable agregando cada elemento a sí mismo de la misma manera que lo hace el método de extensión de la lista.
Aquí hay una clase personalizada simple que implementa el __iadd__
método especial. Inicializa el objeto con un int, luego puede usar el operador + = para agregar un número. Agregué una declaración impresa __iadd__
para mostrar que se llama. Además, __iadd__
se espera que devuelva un objeto, por lo que devolví la suma de sí mismo más el otro número que tiene sentido en este caso.
>>> class Adder(object):
def __init__(self, num=0):
self.num = num
def __iadd__(self, other):
print 'in __iadd__', other
self.num = self.num + other
return self.num
>>> a = Adder(2)
>>> a += 3
in __iadd__ 3
>>> a
5
Espero que esto ayude.
__iadd__
que devuelve un tipo diferente (que a su vez se puede agregar)
+=
agrega otro valor con el valor de la variable y asigna el nuevo valor a la variable.
>>> x = 3
>>> x += 2
>>> print x
5
-=
, *=
, /=
Hace similar para la resta, multiplicación y división.
x += 5
no es exactamente lo mismo que decir x = x + 5
en Python.
Nota aquí:
In [1]: x = [2,3,4]
In [2]: y = x
In [3]: x += 7,8,9
In [4]: x
Out[4]: [2, 3, 4, 7, 8, 9]
In [5]: y
Out[5]: [2, 3, 4, 7, 8, 9]
In [6]: x += [44,55]
In [7]: x
Out[7]: [2, 3, 4, 7, 8, 9, 44, 55]
In [8]: y
Out[8]: [2, 3, 4, 7, 8, 9, 44, 55]
In [9]: x = x + [33,22]
In [10]: x
Out[10]: [2, 3, 4, 7, 8, 9, 44, 55, 33, 22]
In [11]: y
Out[11]: [2, 3, 4, 7, 8, 9, 44, 55]
Consulte como referencia: ¿Por qué + = se comporta de forma inesperada en las listas?
x += 7,8,9
+=
agrega un número a una variable, cambiando la variable en sí en el proceso (mientras +
que no lo haría). De manera similar a esto, existen los siguientes que también modifican la variable:
-=
, resta un valor de la variable, estableciendo la variable en el resultado*=
, multiplica la variable y un valor, haciendo que el resultado sea la variable/=
, divide la variable por el valor, haciendo que el resultado sea la variable%=
, realiza el módulo en la variable, y la variable se establece en el resultado de la mismaPuede haber otros. No soy un programador de Python.
&=
, >>=
, etc.) y los operadores matemáticos adicionales ( **=
, etc.).
Agrega el operando derecho al izquierdo. x += 2
mediox = x + 2
También puede agregar elementos a una lista: vea este hilo SO .
No es un simple atajo sintáctico. Prueba esto:
x=[] # empty list
x += "something" # iterates over the string and appends to list
print(x) # ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']
versus
x=[] # empty list
x = x + "something" # TypeError: can only concatenate list (not "str") to list
Esto ilustra que + = invoca el método de lista iadd pero + invoca add , que hace cosas diferentes con listas.
Teóricamente a + = b "suma" b a almacenando el resultado en a. Esta descripción simplista describiría el operador + = en muchos idiomas.
Sin embargo, la descripción simplista plantea un par de preguntas.
En Python, las respuestas a ambas preguntas dependen del tipo de datos de a.
Entonces, ¿qué significa exactamente "agregar"?
Tenga en cuenta que para las listas + = es más flexible que +, el operador + en una lista requiere otra lista, pero el operador + = aceptará cualquier iterable.
Entonces, ¿qué significa "almacenar el valor en un"?
Si el objeto es mutable, se recomienda (pero no es obligatorio) realizar la modificación en el lugar. Entonces, a apunta al mismo objeto que antes, pero ese objeto ahora tiene un contenido diferente.
Si el objeto es inmutable, obviamente no puede realizar la modificación en el lugar. Algunos objetos mutables también pueden no tener una implementación de una operación de "agregar" en el lugar. En este caso, la variable "a" se actualizará para apuntar a un nuevo objeto que contiene el resultado de una operación de adición.
Técnicamente esto se implementa buscando __IADD__
primero, si eso no se implementa entonces __ADD__
se intenta y finalmente __RADD__
.
Se requiere cuidado al usar + = en Python en variables en las que no estamos seguros del tipo exacto y, en particular, cuando no estamos seguros de si el tipo es mutable o no. Por ejemplo, considere el siguiente código.
def dostuff(a):
b = a
a += (3,4)
print(repr(a)+' '+repr(b))
dostuff((1,2))
dostuff([1,2])
Cuando invocamos dostuff con una tupla, la tupla se copia como parte de la operación + = y, por lo tanto, b no se ve afectado. Sin embargo, cuando lo invocamos con una lista, la lista se modifica en su lugar, por lo que tanto a como b se ven afectados.
En Python 3, se observa un comportamiento similar con los tipos "bytes" y "bytearray".
Por último, tenga en cuenta que la reasignación ocurre incluso si el objeto no se reemplaza. Esto no importa mucho si el lado izquierdo es simplemente una variable, pero puede causar un comportamiento confuso cuando tiene una colección inmutable que se refiere a colecciones mutables, por ejemplo:
a = ([1,2],[3,4])
a[0] += [5]
En este caso, [5] se agregará con éxito a la lista a la que hace referencia un [0], pero luego se generará una excepción cuando el código intente y no pueda reasignar un [0].
La respuesta corta se +=
puede traducir como "agregue lo que esté a la derecha del + = a la variable a la izquierda del + =".
Ex. Si lo ha hecho, a = 10
entonces a += 5
sería: a = a + 5
Entonces, "a" ahora es igual a 15.
Nota x += y
no es lo mismo que x = x + y
en algunas situaciones en las que se incluye un operador adicional debido a la precedencia del operador combinada con el hecho de que el lado derecho siempre se evalúa primero, p. Ej.
>>> x = 2
>>> x += 2 and 1
>>> x
3
>>> x = 2
>>> x = x + 2 and 1
>>> x
1
Tenga en cuenta que el primer caso se expande a:
>>> x = 2
>>> x = x + (2 and 1)
>>> x
3
Es más probable que encuentre esto en el 'mundo real' con otros operadores, p. Ej.
x *= 2 + 1
== x = x * (2 + 1)
! =x = x * 2 + 1
+=
es solo un atajo para escribir
number = 4
number = number + 1
Entonces, en cambio, escribirías
numbers = 4
numbers += 1
Ambas formas son correctas, pero el ejemplo dos le ayuda a escribir un poco menos de código
Como también dijeron otros, el operador + = es un atajo. Un ejemplo:
var = 1;
var = var + 1;
#var = 2
También podría escribirse así:
var = 1;
var += 1;
#var = 2
Entonces, en lugar de escribir el primer ejemplo, puede simplemente escribir el segundo, que funcionaría bien.
Veo muchas respuestas que no aparecen usando + = con múltiples enteros.
Un ejemplo:
x -= 1 + 3
Esto sería similar a:
x = x - (1 + 3)
y no:
x = (x - 1) + 3
Según la documentación
x += y
es equivalente ax = operator.iadd(x, y)
. Otra forma de decirlo es decir quez = operator.iadd(x, y)
es equivalente al enunciado compuestoz = x; z += y
.
Entonces x += 3
es lo mismo que x = x + 3
.
x = 2
x += 3
print(x)
saldrá 5.
Note que también hay
object.__iadd__