Link Search Menu Expand Document

Operadores de asignaci贸n

Anteriormente hemos visto los operadores aritm茅ticos, que usaban dos n煤meros para calcular una operaci贸n aritm茅tica (como suma o resta) y devolver su resultado. En este caso, los operadores de asignaci贸n o assignment operators nos permiten realizar una operaci贸n y almacenar su resultado en la variable inicial. Podemos ver como realmente el 煤nico operador nuevo es el =. El resto son abreviaciones de otros operadores que hab铆amos visto con anterioridad. Ponemos un ejemplo con x=7

OperadorEjemploEquivalente
=x=7x=7
+=x+=2x=x+2 = 7
-=x-=2x=x-2 = 5
*=x*=2x=x*2 = 14
/=x/=2x=x/2 = 3.5
%=x%=2x=x%2 = 1
//=x//=2x=x//2 = 3
**=x**=2x=x**2 = 49
&=x&=2x=x&2 = 2
|=x|=2x=x|2 = 7
^=x^=2x=x^2 = 5
>>=x>>=2x=x>>2 = 1
&lt&lt= x&lt&lt=2 x=x&lt&lt2 = 28
a=7; b=2
print("Operadores de asignaci贸n")
x=a; x+=b;  print("x+=", x)  # 9
x=a; x-=b;  print("x-=", x)  # 5
x=a; x*=b;  print("x*=", x)  # 14
x=a; x/=b;  print("x/=", x)  # 3.5
x=a; x%=b;  print("x%=", x)  # 1
x=a; x//=b; print("x//=", x) # 3
x=a; x**=b; print("x**=", x) # 49
x=a; x&=b;  print("x&=", x)  # 2
x=a; x|=b;  print("x|=", x)  # 7
x=a; x^=b; print("x^=", x)   # 5
x=a; x>>=b; print("x>>=", x) # 1
x=a; x<<=b; print("x<<=", x) # 28

Operador =

El operador = pr谩cticamente no necesita explicaci贸n, simplemente asigna a la variable de la izquierda el contenido que le ponemos a la derecha. Ponemos en negrita variable porque si hacemos algo del tipo 3=5 tendremos un error. Como siempre, nunca te f铆es de nada y experimenta con ello.

x=2       # Uso correcto del operador =
print(x)  # 2
#3=5      # Dar铆a error, 3 no es una variable

Tal vez pienses que el operador = es trivial y apenas merezca explicaci贸n, pero es importante explorar los l铆mites del lenguaje. Si sabes lo que es un puntero, o una referencia tal vez el ejemplo siguiente tenga sentido para t铆. Vamos a ver, si todo lo que hemos visto anteriormente es cierto, a=[1, 2, 3] asigna [1, 2, 3] a a, por lo que si no tocamos a, el valor de a deber谩 ser siempre [1, 2, 3]. Bueno, pues en el siguiente ejemplo vemos como eso no es as铆, el valor de a ha cambiado. Se podr铆a decir que no es lo mismo x=3 con un n煤mero que x=[1, 2, 3] con una lista. No te preocupes si no lo has seguido, en otros cap铆tulos lo explicaremos mejor.

a = [1, 2, 3]
b = a
b += [4]
print(a)
# [1, 2, 3, 4]

Operador +=

Como podemos ver, todos los operadores de asignaci贸n no son m谩s que atajos para escribir otros operadores de manera m谩s corta, y asignar su resultado a la variable inicial. El operador += en x+=1 es equivalente a x=x+1. Sabiendo esto, ser铆a justo preguntarse 驴realmente merece la pena crear un operador nuevo que hace algo que ya podemos hacer pero de manera mas corta? Bien, la pregunta no es f谩cil de responder y en cierto modo viene heredado de lenguajes como C que en los a帽os 1970s introdujeron esto.

x=5      # Ejemplo de como incrementar
x+=1     # en una unidad x
print(x)
# 6

Para saber m谩s: Aunque se podr铆a decir que el operador x+=1 es igual que x=x+1, no es del todo cierto. De hecho el operador que Python invoca por debajo es "__iadd__" en el primer caso frente a "__add__" para el segundo. A efectos pr谩cticos, se podr铆a considerar lo mismo, pero aqu铆 puedes leer m谩s sobre esto

Se puede jugar un poco con el operador += y aplicarlo sobre variables que no necesariamente son n煤meros. Como vimos en otros cap铆tulos, se podr铆a emplear sobre una lista.

x=[1,2,3] # En este caso la x es una lista
x+=[4,5]  # Se aplica el operador sobre otra lista
print(x)  # Y el resultado de la uni贸n de ambas
# [1, 2, 3, 5, 6]

Es muy importante, que si x es una lista, no podemos aplicar el operador += con un elemento que no sea una lista, como por ejemplo, un n煤mero. El siguiente c贸digo dar铆a error porque el operador no esta definido para un elemento lista y otro entero.

x=[1,2,3] #
#x+=3     # ERROR! TypeError

Operador -=

El operador -= es equivalente a restar y asignar el resultado a la variable inicial. Es decir, x-=1 es equivalente a x=x-1. Si vienes de otros lenguajes de programaci贸n, tal vez conozcas la forma x--, pero en Python no existe. El operador es muy usado para decrementar el valor de una variable.

i = 5
i -= 1
print(i) # 4

Y algo que nunca se har铆a en la realidad, pero nos permite explorar los l铆mites del lenguaje, ser铆a restar -1, lo que equivale a sumar uno. Pero de verdad, no hagas esto, en serio.

i = 0
i-=-1    # Aumenta el contador
print(i) # 1

Operador *=

El operador *= equivale a multiplicar una variable por otra y almacenar el resultado en la primera, es decir x*=2 equivale a x=x*2. Hasta ahora hemos usado todos los operadores de asignaci贸n con una variable y un n煤mero, pero es totalmente correcto hacerlo con dos variables.

a=10; b=2 # Inicializamos a 10 y 20
a*=b      # Usando dos variables
print(a)  # 20

Operador /=

El operador /= equivale a dividir una variable por otra y almacenar el resultado en la primera, es decir, x/=2 equivale a x=x/2. Acu茅rdate que en otros cap铆tulos vimos como 5/3 en versiones antiguas de Python, pod铆a causar problemas ya que el resultado no era un numero entero. En el siguiente ejemplo podemos ver como Python hace el trabajo por nosotros, y cambia el tipo de la variable x de lo que inicialmente era int a un float con el objetivo de que el nuevo valor pueda ser almacenado.

x = 10
print(type(x)) # <class 'int'>
x/=3
print(type(x)) # <class 'float'>

Operador %=

El operador %= equivale a hacer el m贸dulo de la divisi贸n de dos variables y almacenar su resultado en la primera.

x = 3
x%=2
print(x) # 1

Una curiosidad a tener en cuenta, es que el operador m贸dulo tiene diferentes comportamientos en Python del que tiene en otros lenguajes como C cuando se usan n煤meros negativos tanto de dividendo como de divisor. As铆 que ten cuidado si haces cosas como las siguientes.

print(-5%-3) # -2
print(5%-3)  # -1
print(-5%3)  #  1
print(5%3)   #  2

Operador //=

El operador //= realiza la operaci贸n cociente entre dos variables y almacena el resultado en la primera. El equivalente de x//=2 ser铆a x=x//2.

x=5      # El resultado es el cociente
x//=3    # de la divisi贸n
print(x) # 1

Operador **=

El operador **= realiza la operaci贸n exponente del primer n煤mero elevado al segundo, y almacena el resultado en la primera variable. El equivalente de x**=2 ser铆a x=x**2.

x=5      # Eleva el n煤mero al cuadrado
x**=2    # y guarda el resultado en la misma
print(x) # 25

Otro ejemplo similar, ser铆a empleando un exponente negativo, algo que es totalmente v谩lido y equivale matem谩ticamente al inverso del n煤mero elevado al exponente en positivo. Dicho de otra forma, $x^{-2}$ equivale a $1/x^2$.

x=5      # Elevar 5 a -2 equivale a dividir
x**=-2   # uno entre 25.
print(x) # 0.04

Operador &=

El operador &= realiza la comparaci贸n & bit a bit entre dos variables y almacena su resultado en la primera. El equivalente de x&=1 ser铆a x=x&1

a = 0b101010
a&= 0b111111
print(bin(a))
# 0b101010

Operador |=

El operador |= realiza el operador | elemento a elemento entre dos variables y almacena su resultado en la primera. El equivalente de x|=2 ser铆a x=x|2

a = 0b101010
a|= 0b111111
print(bin(a))
# 0b111111

Operador ^=

El operador ^= realiza el operador ^ elemento a elemento entre dos variables y almacena su resultado en la primera. El equivalente de x^=2 ser铆a x=x^2

a = 0b101010
a^= 0b111111
print(bin(a))
# 0b10101

Operador聽禄=

El operador >>= es similar al operador >> pero permite almacenar el resultado en la primera variable. Por lo tanto x>>=3 ser铆a equivalente a x=x>>3

x = 10
x>>=1
print(x) # 5

Es importante tener cuidado y saber el tipo de la variable x antes de aplicar este operador, ya que se podr铆a dar el caso de que x fuera una variable tipo float. En ese caso, tendr铆amos un error porque el operador >> no esta definido para float.

x=10.0         # Si la x es float
print(type(x)) # <class 'float'>
#x>>=1         # ERROR! TypeError

Operador 芦=

Muy similar al anterior, <<= aplica el operador << y almacena su contenido en la primera variable. El equivalente de x<<=1 ser铆a x=x<<1

x=10     # Inicializamos a 10
x<<=1    # Desplazamos 1 a la izquierda
print(x) # 20

Ser铆a justo pensar que si << realiza un desplazamiento de bits a la izquierda y >> lo realiza a la derecha, tal vez un desplazamiento << una unidad, podr铆a equivaler a -1 desplazamiento a la derecha.

#x<<=-1 # ERROR! Python no define un desplazamiento negativo a la izquierda
#x>>=-1 # ERROR! Python no define un desplazamiento negativo a la derecha