None en Python representa la ausencia de un valor. No es cero, una cadena vacía ni False, aunque se considera falsy en una condición. Comprender esta diferencia evita errores en funciones, diccionarios, parámetros opcionales, respuestas de APIs y procesamiento de datos.
En esta guía aprenderás qué es None, cómo compararlo, por qué una función puede devolverlo, cómo distinguir un valor ausente de uno válido y cuándo utilizar un objeto centinela. La documentación oficial de constantes integradas define None, y la PEP 8 recomienda compararlo mediante is.
None es un objeto único
resultado = None
print(resultado)
print(type(resultado))
print(resultado is None)El tipo se llama NoneType. En una ejecución existe un único objeto None, por eso la comparación correcta utiliza identidad.
Usar is None
usuario = None
if usuario is None:
print("No se encontró el usuario")Evita usuario == None. Un objeto personalizado puede redefinir el operador de igualdad, mientras is None comprueba identidad de forma directa.
None es falsy, pero no equivale a False
valor = None
print(bool(valor))
print(valor == False)
print(valor is False)La primera expresión devuelve falso porque None es falsy, pero las comparaciones con el booleano False no son verdaderas. La guía de booleanos en Python explica valores truthy y falsy.
Distinguir None, cero y cadena vacía
def mostrar_descuento(descuento):
if descuento is None:
print("Descuento no informado")
elif descuento == 0:
print("Sin descuento")
else:
print(f"Descuento: {descuento:.0%}")Los tres estados tienen significados diferentes. Una condición como if not descuento mezclaría ausencia con cero.
Funciones que no devuelven explícitamente
def saludar(nombre):
print(f"Hola, {nombre}")
resultado = saludar("Ana")
print(resultado) # NoneCuando una función termina sin return, Python devuelve None implícitamente. Esto suele causar confusión al mezclar una función que imprime con otra que debe producir un valor.
def crear_saludo(nombre):
return f"Hola, {nombre}"
mensaje = crear_saludo("Ana")
print(mensaje)La guía de funciones en Python explica la diferencia entre imprimir y devolver.
Métodos que modifican y devuelven None
numeros = [3, 1, 2]
resultado = numeros.sort()
print(numeros)
print(resultado) # Nonelist.sort() modifica la lista y devuelve None. Este diseño evita creer que se creó una colección nueva.
ordenados = sorted(numeros)La función sorted() devuelve una lista nueva. Consulta la guía de sort() frente a sorted().
Parámetros opcionales
def buscar_usuarios(limite=None):
usuarios = cargar_usuarios()
if limite is None:
return usuarios
return usuarios[:limite]Aquí None significa “sin límite”. Cero puede significar legítimamente “no devolver elementos”.
Evitar valores mutables como predeterminados
def agregar_tarea(tarea, tareas=None):
if tareas is None:
tareas = []
tareas.append(tarea)
return tareasUsar None permite crear una lista nueva en cada llamada. Un valor predeterminado como [] se compartiría entre llamadas.
Acceso seguro en diccionarios
usuario = {"nombre": "Luis", "telefono": None}
telefono = usuario.get("telefono")
if telefono is None:
print("No hay teléfono disponible")Existe una ambigüedad: get() devuelve None tanto cuando falta la clave como cuando el valor guardado es None.
if "telefono" not in usuario:
print("La clave no existe")
elif usuario["telefono"] is None:
print("La clave existe, pero no tiene valor")La guía de diccionarios en Python explica get(), pertenencia y valores predeterminados.
Usar un centinela cuando None es válido
NO_ENCONTRADO = object()
def obtener_configuracion(clave, predeterminado=NO_ENCONTRADO):
if clave in configuracion:
return configuracion[clave]
if predeterminado is NO_ENCONTRADO:
raise KeyError(clave)
return predeterminadoUn objeto centinela distingue “no se proporcionó un valor” de “se proporcionó None”.
None en condiciones
respuesta = obtener_respuesta()
if respuesta is not None and respuesta.get("activo"):
print("Respuesta activa")El cortocircuito evita acceder a un método cuando el objeto es None. Sin embargo, una condición larga puede ser más clara con variables intermedias.
None y excepciones
Devolver None es adecuado cuando la ausencia es un resultado normal y está documentado. Si la operación no puede cumplir su contrato o la ausencia indica un fallo, una excepción puede ser más clara.
def dividir(a, b):
if b == 0:
raise ValueError("El divisor no puede ser cero")
return a / bNo devuelvas None silenciosamente para cualquier error. La guía de try y except en Python ayuda a elegir entre un resultado ausente y una excepción.
Type hints con valores opcionales
def buscar_nombre(usuario_id: int) -> str | None:
usuario = buscar_usuario(usuario_id)
if usuario is None:
return None
return usuario["nombre"]La anotación str | None comunica que quien llama debe manejar ambos resultados. En versiones antiguas puede utilizarse Optional[str].
None en JSON
import json
datos = {"nombre": "Ana", "telefono": None}
texto = json.dumps(datos)
print(texto)Al serializar JSON, None se convierte en null. Al leer JSON, null se convierte en None. La presencia de null no significa necesariamente que una clave falte.
None en Pandas
En datos tabulares pueden coexistir None, NaN y pd.NA. Pandas ofrece isna() y notna() para detectar valores ausentes de forma consistente.
import pandas as pd
serie = pd.Series([1, None, 3])
print(serie.isna())La guía de Pandas para principiantes explica limpieza y valores ausentes.
Comprobar None en una colección
valores = [10, None, 20, None]
sin_ausentes = [
valor
for valor in valores
if valor is not None
]
print(sin_ausentes)No uses if valor cuando deseas conservar ceros o cadenas vacías.
Errores frecuentes
- Comparar con
== None. - Confundir
Nonecon cero o cadena vacía. - Esperar un retorno de una función que solo imprime.
- Asignar el resultado de un método que modifica una lista.
- Usar
dict.get()sin considerar que el valor guardado puede serNone. - Devolver
Nonepara ocultar cualquier error. - Filtrar con
if valory eliminar valores válidos falsy. - No documentar un retorno opcional.
Cuándo usar None
- Cuando una función puede no encontrar un resultado de forma normal.
- Como valor predeterminado para parámetros opcionales.
- Para representar un campo conocido sin valor disponible.
- Para inicializar una referencia que será asignada después.
Conclusión
None en Python representa ausencia, no falsedad general. Compáralo con is None, distingue su significado de cero y cadenas vacías, y documenta funciones que pueden devolverlo. Cuando None sea un valor válido, utiliza un centinela para representar la ausencia de argumento.
Elegir entre None y una excepción depende del contrato. La ausencia normal puede expresarse con un retorno opcional; un estado inválido o un fallo que no debe ignorarse merece una excepción clara.






