Los desarrolladores principiantes a menudo ven este tipo de código en las sentencias condicionales:

if value:
    print("¡Hay un valor!")

Al principio, puede ser confuso entender qué está comprobando una simple sentencia como if value:.
Particularmente con los siguientes dos:

  • None
  • "" (cadena vacía)

Ambos se evalúan como False, lo que puede hacer que parezcan lo mismo.

¿Pero realmente lo son?


Valores Falsy

En Python, los siguientes valores se evalúan como False en la condición:

  • None
  • False
  • 0, 0.0
  • "" (cadena vacía)
  • [] (lista vacía)
  • {} (diccionario vacío)
  • set(), () y otras colecciones vacías

Es decir, if not value: captura todos estos casos a la vez.


None y "" son diferentes

Se ven diferentes y comportan de manera distinta.

value1 = None
value2 = ""

print(value1 == value2)  # False
print(value1 is value2)  # False

print(bool(value1))  # False
print(bool(value2))  # False
  • == es una comparación de valores, mientras que is es una comparación de identidad.
  • None es un objeto especial que significa "no hay valor aún",
  • "" es una cadena que está vacía.

Comparación de burbujas de diálogo sobre vacío vs None

En la imagen, el hombre a la izquierda sostiene una burbuja de diálogo pero no dice nada — esto representa la cadena vacía "".
La mujer a la derecha no tiene burbuja de diálogo — esto representa None.

Ambos se evalúan como False bajo las siguientes condiciones:

male_voice = ""
female_voice = None

if not male_voice and not female_voice:
    print("¡Ninguno de los dos habla!")  # Se ejecuta porque ambos son False

¿Cómo diferenciarlos en la práctica?

Veamos un ejemplo al procesar la entrada del usuario:

username = user_input.get("username", None)
  1. Si el usuario no ha ingresado nada → None
  2. Si el usuario ha ingresado una cadena vacía → ""

¿Quieres tratarlos de manera diferente?

if username is None:
    print("¡No has ingresado nada!")
elif username == "":
    print("Has ingresado una cadena vacía.")
else:
    print("Valor ingresado:", username)

Errores comunes en la práctica

El siguiente código a veces filtra involuntariamente todos los valores Falsy:

if not username:
    print("No hay entrada")

Sin embargo, esta condición incluye no solo cadenas vacías, sino también None, 0, listas vacías, etc.
Por lo tanto, es importante ser claro sobre la intención:

  • Incluso si está vacío, debe permitir la cadenaif username is None:
  • La cadena debe existir, aunque esté vacíaif username != "":
  • Simplemente no debe haber ningún valorif not username:

Resumiendo

None y "" no son lo mismo. Sin embargo, ambos funcionan como False.
Conocer esta diferencia puede hacer que tus intenciones en el código sean más claras y libres de errores.

En el próximo artículo, profundizaremos en otros valores Falsy como 0, [], {} y la diferencia entre is y ==!