¿Qué hace exactamente + = en Python?

118

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.

Salvatore Mucciolo
fuente
5
object.__iadd__
efímero
2
es un operador básico para Python (y muchos otros lenguajes también), debe comenzar con Google, si nunca lee ninguna referencia de Python.
technomage
3
@AndiDog Si bien es cierto que ambas preguntas son sobre el operador (+ =), la que vinculó se trata de un uso sofisticado y un problema sutil, y el OP aquí probablemente no pueda seguir el razonamiento allí (todavía).
Dr. belisarius
3
@AndiDog Quizás tenías razón en ese momento, pero mirando las soluciones (casi) aceptadas aquí, está claro que esta pregunta se trata de una comprensión básica del operador: D
Dr. belisarius
1
La mayoría de los usos de sumbol ahora están indexados en la página de símbolos docs.python.org/3/genindex-Symbols.html .
Terry Jan Reedy

Respuestas:

148

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.

Bryan
fuente
24
Si bien esto no es lo que estaba buscando el Asker, +1 para la respuesta real. =)
Michael
@Michael, ahí es donde el humor se suma al hecho ... :-D
Aaron John Sabu
3
+1 para responder a la pregunta, pero -1 para una __iadd__que devuelve un tipo diferente (que a su vez se puede agregar)
Caleth
Esta respuesta es demasiado compleja para el tipo de persona que necesitaría preguntar qué significa + = (es decir, un principiante). Su respuesta no es una respuesta para principiantes, no solo porque los principiantes generalmente no comienzan a aprender Python de una manera orientada a objetos, sino también porque hay respuestas mucho más simples (como las de @ Imran a continuación). Solo mis dos centavos, aunque agradezco esta respuesta.
q-compute
129

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

Imran
fuente
19
"sí mismo" es en realidad una muy mala descripción aquí, ya que los números enteros son inmutables.
AndiDog
41

x += 5no es exactamente lo mismo que decir x = x + 5en 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?

Roshan Mehta
fuente
Sin embargo, es lo mismo, excepto por el caso extrañox += 7,8,9
ovnis
Además, uno de los hilos vinculados proporciona una buena discusión sobre dónde difiere exactamente. stackoverflow.com/questions/6951792/…
Ufos
31

+=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 misma

Puede haber otros. No soy un programador de Python.

Ryan Bigg
fuente
2
Para los números, esta respuesta es correcta. (Véase la respuesta de Bryan para un comportamiento especial.) No son de hecho varios otros, incluyendo operadores de bits ( &=, >>=, etc.) y los operadores matemáticos adicionales ( **=, etc.).
Michael
16

Agrega el operando derecho al izquierdo. x += 2mediox = x + 2

También puede agregar elementos a una lista: vea este hilo SO .

Kaleb Brasee
fuente
15

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.

CS
fuente
7

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.

  1. ¿Qué queremos decir exactamente con "agregar"?
  2. ¿Qué queremos decir exactamente con "almacenar el resultado en un"? Las variables de Python no almacenan valores directamente, almacenan referencias a objetos.

En Python, las respuestas a ambas preguntas dependen del tipo de datos de a.


Entonces, ¿qué significa exactamente "agregar"?

  • Para números, significa suma numérica.
  • Para listas, tuplas, cadenas, etc., significa concatenación.

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

enchufar
fuente
5

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 = 10entonces a += 5sería: a = a + 5

Entonces, "a" ahora es igual a 15.

Roman Skydan
fuente
¿Qué aporta esta respuesta que aún no se haya discutido? Es una respuesta duplicada ...
jdv, solo intento ayudar. Soy un colaborador nuevo, lo siento si cree que mi respuesta fue un duplicado.
Está claro que es un duplicado si observa la mayoría de las otras respuestas. Está bien contribuir, pero debe esforzarse por contribuir con algo nuevo (por ejemplo, como la respuesta add vs iadd) o si quiere intentar una solución más clara. Pero, por lo que puedo decir, las respuestas más votadas son lo más claras posible para una respuesta básica.
4

Nota x += yno es lo mismo que x = x + yen 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

Chris_Rands
fuente
4

+= 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

Vash
fuente
1
El comportamiento es el mismo en los números, pero no es el mismo en general.
Plugwash
0

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.

ZeroFunter
fuente
0

Recuerde cuando solía sumar, por ejemplo, 2 y 3, en su calculadora anterior y cada vez que presiona el =botón, ve 3 agregado al total, +=hace un trabajo similar. Ejemplo:

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8
salhin
fuente
0

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
Javier Pérez
fuente
0

Según la documentación

x += yes equivalente a x = operator.iadd(x, y). Otra forma de decirlo es decir que z = operator.iadd(x, y)es equivalente al enunciado compuesto z = x; z += y.

Entonces x += 3es lo mismo que x = x + 3.

x = 2

x += 3

print(x)

saldrá 5.

Note que también hay

Tiago Martins Peres 李大仁
fuente