TypeError: 'NoneType' object is not subscriptable en Python
Un error diario en Python que confunde a todos. Qué significa realmente, las tres causas más comunes con su ejemplo, y cómo corregir cada una.
Estás ejecutando tu código y Python te corta con esto:
TypeError: 'NoneType' object is not subscriptable
Suena críptico, pero dice algo muy concreto. Vamos a traducirlo y a ver las tres causas que lo provocan casi siempre, cada una con su ejemplo y su arreglo.
Qué significa en realidad
“Subscriptable” es la capacidad de acceder a algo con corchetes: lista[0], diccionario["clave"], texto[2]. El error dice que estás usando corchetes sobre un valor que es None, y None no tiene contenido al que acceder.
En otras palabras: esperabas una lista o un diccionario, pero lo que tienes es None. La pregunta correcta no es “¿por qué falla el corchete?”, sino “¿por qué esta variable es None cuando yo esperaba datos?”. Vamos a las causas.
Causa 1: una función que olvidó el return
La más común. Tienes una función que hace su trabajo pero no devuelve el resultado, así que al usarla obtienes None.
def buscar_usuario(id):
usuario = {"id": id, "nombre": "Ana"}
# ¡falta el return!
u = buscar_usuario(1)
print(u["nombre"]) # TypeError: 'NoneType' object is not subscriptable
La función construye el diccionario pero no lo devuelve, entonces u es None. El arreglo es obvio una vez lo ves:
def buscar_usuario(id):
usuario = {"id": id, "nombre": "Ana"}
return usuario # ahora sí devuelve algo
Cada vez que una función deba darte un dato, revisa que tenga su return. Es el olvido número uno.
Causa 2: un método que devuelve None por diseño
Algunos métodos de Python modifican el objeto en el sitio y devuelven None, no el objeto modificado. El caso clásico es sort():
numeros = [3, 1, 2]
ordenados = numeros.sort() # sort() devuelve None
print(ordenados[0]) # TypeError: NoneType not subscriptable
sort() ordena la lista original pero no devuelve nada. Lo mismo pasa con append(), reverse(), y varios más. El arreglo es usar la lista original, o la función que sí devuelve:
numeros = [3, 1, 2]
numeros.sort() # ordena numeros directamente
print(numeros[0]) # 1
# o, si quieres una lista nueva sin tocar la original:
ordenados = sorted(numeros) # sorted() SÍ devuelve la lista
print(ordenados[0])
La regla: si un método “hace algo” a un objeto (ordenar, invertir, añadir), probablemente devuelve None. Si quieres un valor de vuelta, busca la versión que lo devuelve.
Causa 3: una búsqueda que no encontró nada
Muy frecuente al trabajar con datos externos: bases de datos, JSON, scraping. Cuando la búsqueda no encuentra resultado, muchas funciones devuelven None, y tú intentas acceder igual.
import re
texto = "sin números aquí"
resultado = re.search(r"\d+", texto) # no encuentra dígitos → None
print(resultado[0]) # TypeError: NoneType not subscriptable
Lo mismo ocurre con un fetchone() de base de datos cuando la consulta no devuelve filas, o con un .get() de diccionario sobre una clave que no existe. El arreglo es comprobar antes de acceder:
import re
texto = "sin números aquí"
resultado = re.search(r"\d+", texto)
if resultado is not None:
print(resultado[0])
else:
print("No se encontró ningún número")
Ese if resultado is not None es el patrón que blinda tu código contra este error cuando trabajas con datos que podrían no estar.
El diagnóstico en un paso
Cuando aparezca, no mires el corchete: mira de dónde salió la variable que estás indexando. Recórrelo así:
- ¿Viene de una función tuya? → revisa que tenga
return. - ¿Viene de un método como
sort(),append()? → ese método devuelveNone; usa el objeto original o la versión que devuelve valor. - ¿Viene de una búsqueda (regex, base de datos,
.get(), scraping)? → compruebaif x is not Noneantes de usarla.
El error asusta por el nombre, pero siempre se reduce a lo mismo: algo te dio None cuando esperabas datos. Encuentra ese “algo” y el resto es directo.
¿Te salió este error en un contexto que no encaja en estos tres? Escríbeme desde contacto con el fragmento de código y lo revisamos.