None en Python: significado y buenas prácticas

Publicado el: 11/07/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

    texto 'operadores em Python' com os simbolos de operadores e o logo do Python à direita
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Operadores en Python: tipos y ejemplos prácticos

    Aprende los operadores en Python: aritméticos, comparación, asignación, lógicos, pertenencia, identidad, bits, sets y precedencia.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Ilustração representando conjuntos (sets) em Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Sets en Python: guía completa para principiantes

    Aprende sets en Python: valores únicos, pertenencia, unión, intersección, diferencia, subconjuntos, frozenset, comprensiones y ejemplos.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    Programador resolvendo problemas com Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Lógica de programación con Python para principiantes

    Aprende lógica de programación con Python: algoritmos, pseudocódigo, variables, condiciones, bucles, funciones, validación y un proyecto práctico.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    Código Python com valores Boolean True e False em tela de computador
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Booleanos en Python: True, False y lógica

    Aprende booleanos en Python con True, False, comparaciones, operadores lógicos, valores truthy y falsy, cortocircuito y validación.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026
    Símbolo de repetição ao lado do logotipo do Python pensativo, representando o conceito de loops na programação em Python.
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Bucles en Python: for, while, break y continue

    Aprende bucles en Python con for, while, range, enumerate, zip, break, continue, else, validación y ejemplos prácticos.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026
    Código Python mostrando uma função recursiva de fatorial com condição if e chamada da função dentro dela
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Recursión en Python: guía práctica con ejemplos

    Aprende recursión en Python con casos base, pila de llamadas, factorial, árboles, directorios, memoización, límites y alternativas iterativas.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026