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



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.


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.


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?


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.


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


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.


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


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.


¿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


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


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.


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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.