Unpacking: desempaquetar tuplas, listas y diccionarios
El unpacking es uno de los superpoderes de Python. Asignar múltiples variables de una colección en una sola línea, con soporte para el operador * para capturar el resto.
Unpacking básico de tuplas y listas
El unpacking permite asignar los elementos de una colección a múltiples variables en una sola instrucción:
# Unpacking de tupla
coordenadas = (40.7128, -74.0060)
latitud, longitud = coordenadas
print(f"Lat: {latitud}, Lon: {longitud}")
# Unpacking de lista
colores = ["rojo", "verde", "azul"]
primero, segundo, tercero = colores
print(primero, segundo, tercero)
# El número de variables debe coincidir con el número de elementos
# nombre, edad = ("Ana", 28, "Madrid") # ValueError: too many values to unpack
# Ignorar valores con _ (convención)
nombre, _, ciudad = ("Ana", 28, "Madrid") # ignoramos la edad
print(f"{nombre} de {ciudad}")
# Unpacking en múltiples niveles
punto_3d = ((1, 2), 3)
(x, y), z = punto_3d
print(f"x={x}, y={y}, z={z}")
Lat: 40.7128, Lon: -74.006
rojo verde azul
Ana de Madrid
x=1, y=2, z=3Por convención, _ (guion bajo simple) se usa para variables que deliberadamente no vas a usar. El linter no se queja de variables _ sin usar, a diferencia de otras variables.
El operador * para capturar el resto
El operador * en el unpacking captura todos los elementos que no fueron asignados a otras variables:
# * captura el "resto" como lista
numeros = [1, 2, 3, 4, 5, 6, 7]
primero, *resto = numeros
print(primero) # 1
print(resto) # [2, 3, 4, 5, 6, 7]
*inicio, ultimo = numeros
print(inicio) # [1, 2, 3, 4, 5, 6]
print(ultimo) # 7
# * en el medio
primer, *medio, penultimo, ultimo = numeros
print(primer) # 1
print(medio) # [2, 3, 4, 5]
print(penultimo) # 6
print(ultimo) # 7
# Útil para head/tail de listas
datos = [10, 20, 30, 40, 50]
cabeza, *cola = datos
print(f"Cabeza: {cabeza}") # Cabeza: 10
print(f"Cola: {cola}") # Cola: [20, 30, 40, 50]
# * con strings
primera_letra, *resto_letras = "Python"
print(primera_letra) # P
print(resto_letras) # ['y', 't', 'h', 'o', 'n']
1
[2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6]
7
1
[2, 3, 4, 5]
6
7
Cabeza: 10
Cola: [20, 30, 40, 50]
P
['y', 't', 'h', 'o', 'n']Unpacking en for loops
El unpacking en for hace el código más expresivo al nombrar cada componente:
# Unpacking de tuplas en for
puntos = [(1, 2), (3, 4), (5, 6)]
# ❌ Sin unpacking (menos claro)
for punto in puntos:
print(punto[0] + punto[1])
# ✅ Con unpacking (más claro)
for x, y in puntos:
print(f"Punto ({x}, {y}) → distancia desde origen: {(x**2 + y**2)**0.5:.2f}")
# Unpacking con enumerate
nombres = ["Ana", "Carlos", "Beatriz"]
for indice, nombre in enumerate(nombres, start=1):
print(f"{indice}. {nombre}")
# Unpacking con zip
claves = ["nombre", "edad", "ciudad"]
valores = ["Ana", 28, "Madrid"]
for clave, valor in zip(claves, valores):
print(f"{clave}: {valor}")
# Unpacking de pares de una lista
pares = [("a", 1), ("b", 2), ("c", 3)]
diccionario = {clave: valor for clave, valor in pares}
print(diccionario) # {"a": 1, "b": 2, "c": 3}
3
7
11
Punto (1, 2) → distancia desde origen: 2.24
Punto (3, 4) → distancia desde origen: 5.00
Punto (5, 6) → distancia desde origen: 7.81
1. Ana
2. Carlos
3. Beatriz
nombre: Ana
edad: 28
ciudad: Madrid
{'a': 1, 'b': 2, 'c': 3}Intercambio de variables
Una de las aplicaciones más elegantes del unpacking es intercambiar dos variables sin necesitar una variable temporal:
a = 10
b = 20
# ❌ Forma tradicional (otros lenguajes)
# temp = a
# a = b
# b = temp
# ✅ Forma pythónica — unpacking en acción
a, b = b, a
print(f"a={a}, b={b}") # a=20, b=10
# También funciona con cualquier número de variables
x, y, z = 1, 2, 3
x, y, z = z, x, y # rotación
print(x, y, z) # 3 1 2
# Desempaquetar múltiples valores de retorno
def obtener_extremos(numeros):
return min(numeros), max(numeros), sum(numeros) / len(numeros)
datos = [4, 2, 8, 1, 6]
minimo, maximo, promedio = obtener_extremos(datos)
print(f"Min={minimo}, Max={maximo}, Promedio={promedio}")
a=20, b=10
3 1 2
Min=1, Max=8, Promedio=4.2a, b = b, a funciona porque Python evalúa primero el lado derecho completo (creando la tupla (b, a) con los valores actuales) y luego realiza el unpacking a las variables de la izquierda. No hay ninguna magia — es evaluación de expresión más unpacking.
Practica
Cuatro ejercicios para dominar el unpacking en Python.