Qué es una tupla en Python: características, usos y diferencias
En este artículo
Una tupla es una colección ordenada de elementos que no se puede modificar después de crearse. Es el equivalente inmutable de una lista.
coordenadas = (10, 20)
colores = ("rojo", "verde", "azul")
mixta = (1, "texto", True, 3.14)
Se escriben con paréntesis, aunque técnicamente lo que define una tupla son las comas, no los paréntesis. Esto funciona igual:
punto = 10, 20
print(type(punto)) # <class 'tuple'>
Tupla y lista: la diferencia que importa
| Tupla | Lista | |
|---|---|---|
| Sintaxis | (1, 2, 3) | [1, 2, 3] |
| ¿Se puede modificar? | No | Sí |
| Velocidad | Algo más rápida | Algo más lenta |
| Memoria | Menos | Más |
| ¿Sirve como clave de diccionario? | Sí | No |
| Métodos disponibles | 2 | 11 |
lista = [1, 2, 3]
lista[0] = 99 # ✅ funciona
tupla = (1, 2, 3)
tupla[0] = 99 # ❌ TypeError: 'tuple' object does not support item assignment
Por qué usar algo que no se puede modificar
La pregunta es razonable, y tiene cuatro respuestas concretas.
1. Comunica intención
Al usar una tupla, le dices a quien lea el código —incluido tú dentro de seis meses— que esos valores no deben cambiar. Es documentación implícita.
DIAS = ("lunes", "martes", "miércoles", "jueves", "viernes")
RGB_ROJO = (255, 0, 0)
2. Protege contra modificaciones accidentales
Si pasas una lista a una función, esa función puede modificarla sin que te enteres. Con una tupla, no puede.
3. Sirve como clave de diccionario
Esta es la razón más práctica. Las claves de un diccionario deben ser inmutables:
ubicaciones = {
(40.4, -3.7): "Madrid",
(19.4, -99.1): "Ciudad de México"
}
print(ubicaciones[(40.4, -3.7)]) # Madrid
# Con listas no funciona:
# {[40.4, -3.7]: "Madrid"} → TypeError: unhashable type: 'list'
4. Es más eficiente
Ocupa menos memoria y se recorre algo más rápido. Con colecciones pequeñas no se nota, pero en estructuras grandes o en bucles muy repetidos, sí.
Operaciones con tuplas
Acceder a elementos
colores = ("rojo", "verde", "azul", "amarillo")
colores[0] # 'rojo' (los índices empiezan en 0)
colores[-1] # 'amarillo' (negativo: cuenta desde el final)
colores[1:3] # ('verde', 'azul')
colores[:2] # ('rojo', 'verde')
Desempaquetado
Es una de las cosas más elegantes de Python:
punto = (10, 20)
x, y = punto
print(x, y) # 10 20
# Intercambiar valores sin variable auxiliar
a, b = 1, 2
a, b = b, a # ahora a=2, b=1
Con el asterisco puedes recoger el resto en una lista:
numeros = (1, 2, 3, 4, 5)
primero, *resto = numeros
print(primero) # 1
print(resto) # [2, 3, 4, 5]
Los dos únicos métodos
t = (1, 2, 3, 2, 2)
t.count(2) # 3 → cuántas veces aparece
t.index(3) # 2 → en qué posición está
Solo hay dos porque los demás métodos de las listas modifican la colección, y aquí eso no es posible.
Funciones que sí funcionan
len(t) # longitud
max(t), min(t) # mayor y menor
sum(t) # suma
sorted(t) # devuelve una LISTA ordenada, no una tupla
3 in t # True → comprobar pertenencia
El caso raro: la tupla de un solo elemento
Este detalle provoca errores difíciles de detectar:
no_es_tupla = (5)
print(type(no_es_tupla)) # <class 'int'> → es solo un número entre paréntesis
si_es_tupla = (5,)
print(type(si_es_tupla)) # <class 'tuple'>
Hace falta la coma final. Sin ella, los paréntesis son simplemente agrupación matemática.
La tupla vacía sí funciona sin coma: ().
El matiz sobre la inmutabilidad
Una tupla no se puede modificar, pero si contiene objetos mutables, esos sí pueden cambiar:
t = (1, 2, [3, 4])
t[2].append(5) # ✅ funciona
print(t) # (1, 2, [3, 4, 5])
t[2] = [9] # ❌ TypeError
La tupla garantiza que las referencias que contiene no cambian, no que el contenido de esas referencias sea inmutable. Por eso una tupla con una lista dentro tampoco sirve como clave de diccionario.
Usos habituales
Devolver varios valores de una función
def estadisticas(numeros):
return min(numeros), max(numeros), sum(numeros)/len(numeros)
minimo, maximo, media = estadisticas([4, 8, 15, 16])
Cuando en Python "una función devuelve varios valores", en realidad devuelve una tupla.
Recorrer con índice
for i, color in enumerate(("rojo", "verde", "azul")):
print(i, color)
Recorrer dos colecciones a la vez
nombres = ("Ana", "Luis")
edades = (25, 30)
for nombre, edad in zip(nombres, edades):
print(f"{nombre} tiene {edad} años")
Tuplas con nombre
Cuando quieres la inmutabilidad pero acceder por nombre y no por posición:
from collections import namedtuple
Punto = namedtuple("Punto", ["x", "y"])
p = Punto(10, 20)
print(p.x) # 10
print(p[0]) # 10 → también funciona por índice
Mucho más legible que p[0] y p[1] repartidos por el código.
Conversiones
lista = [1, 2, 3]
t = tuple(lista) # (1, 2, 3)
t = (1, 2, 3)
lista = list(t) # [1, 2, 3]
t = tuple("hola") # ('h', 'o', 'l', 'a')
Si necesitas modificar una tupla, el camino es convertirla a lista, cambiarla y volver a convertirla. Aunque si haces eso a menudo, probablemente debería haber sido una lista desde el principio.
Preguntas frecuentes
¿Cuándo uso tupla y cuándo lista?
Tupla si los datos no van a cambiar o representan una unidad (una coordenada, un color RGB, un registro). Lista si vas a añadir, quitar o modificar elementos.
¿Se puede añadir un elemento a una tupla?
No se puede modificar, pero sí crear una nueva: t = t + (4,). Se genera otra tupla en memoria.
¿Existen tuplas en otros lenguajes?
Sí, con variantes: Python, C#, Swift, Rust y Kotlin las tienen. JavaScript no, aunque se simulan con arrays congelados.
¿Por qué (5) no es una tupla?
Porque los paréntesis sin coma son agrupación matemática. Hace falta la coma: (5,).
¿Aprendiendo Python? En nuestro catálogo de cursos técnicos tienes formación desde cero, con acceso inmediato y de por vida.