None en Python: valores ausentes y buenas prácticas

Actualizado el: 20/08/2026
Tempo de leitura: 4 minutos
texto 'None' centralizado com um fundo com as cores do Pyton

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)  # None

Cuando 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)  # None

list.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 tareas

Usar 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 predeterminado

Un 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 / b

No 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 None con 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 ser None.
  • Devolver None para ocultar cualquier error.
  • Filtrar con if valor y 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.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    notebook com código saindo da tela
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Variables: asignación, tipos y alcance en Python

    Aprende variables en Python: asignación, nombres, tipos, conversiones, referencias, mutabilidad, alcance, constantes, None y errores frecuentes.

    Ler mais

    Tempo de leitura: 4 minutos
    12/07/2026
    Diferença entre operadores is e == em Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    == vs is en Python: igualdad vs identidad

    Entiende la diferencia entre == e is en Python, igualdad, identidad, None, interning, copias superficiales, deepcopy y objetos personalizados.

    Ler mais

    Tempo de leitura: 4 minutos
    12/07/2026
    Menu interativo no terminal criado com Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Menú interactivo en terminal con Python

    Crea un menú interactivo en Python con while, funciones, diccionarios, validación, submenús, persistencia JSON y manejo seguro de errores.

    Ler mais

    Tempo de leitura: 4 minutos
    12/07/2026
    ícone de loop com o texto 'While' abaixo
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    while: repite acciones con condiciones en Python

    Aprende bucles while en Python con condiciones, validación, menús, break, continue, else, centinelas, reintentos y buenas prácticas.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Imagem de um quadro negro com várias interrogações no lugar de lâmpadas, e uma lâmpada conectada no meio
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    if, elif y else: lógica condicional en Python

    Aprende if, elif y else en Python con comparaciones, operadores lógicos, validación, rangos, menús, retornos tempranos y pruebas.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    Manipulação de dados JSON em Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    JSON en Python: leer, escribir y validar datos

    Aprende JSON en Python con load, loads, dump, dumps, archivos UTF-8, validación, APIs, Decimal, fechas y escritura segura.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026