Les développeurs débutants rencontrent souvent ce code dans les instructions conditionnelles :

if value:
    print("Il y a une valeur!")

Au début, il est facile de se demander ce que teste cette simple instruction if value:.
Particulièrement les deux suivants :

  • None
  • "" (chaîne vide)

Les deux évaluent False, ce qui peut les faire sembler semblables.

Mais est-ce vraiment le cas ?


Valeurs Falsy

En Python, les valeurs suivantes évaluent à False dans une instruction conditionnelle :

  • None
  • False
  • 0, 0.0
  • "" (chaîne vide)
  • [] (liste vide)
  • {} (dictionnaire vide)
  • set(), () et autres collections vides

C'est-à-dire que if not value: attrape toutes ces valeurs en même temps.


None et "" sont différents

Ils ont des apparences différentes et comportent différemment.

value1 = None
value2 = ""

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

print(bool(value1))  # False
print(bool(value2))  # False
  • == compare les valeurs, tandis que is compare l'identité.
  • None est un objet spécial signifiant « aucune valeur pour le moment »,
  • et "" est une chaîne qui est vide.

Empty vs None speech bubble comparison

Dans l'image ci-dessus, l'homme à gauche tient une bulle de dialogue mais ne dit rien, correspondant à la chaîne vide "".
La femme à droite n'a même pas de bulle de dialogue — c'est None.

Les deux évaluent à False dans les conditions suivantes :

male_voice = ""
female_voice = None

if not male_voice and not female_voice:
    print("Ils ne parlent pas tous les deux !")  # both are False

Alors, comment les différencier dans la pratique ?

Prenons l'exemple du traitement des entrées utilisateur :

username = user_input.get("username", None)
  1. Si l'utilisateur n'a rien saisi → None
  2. Si l'utilisateur a saisi une chaîne vide → ""

Souhaitez-vous les traiter différemment ?

if username is None:
    print("Aucune saisie !")
elif username == "":
    print("Vous avez saisi une chaîne vide.")
else:
    print("Valeur saisie :", username)

Erreurs courantes en pratique

Le code suivant filtre parfois toutes les valeurs Falsy involontairement :

if not username:
    print("Pas de saisie")

Cependant, cette condition inclut non seulement des chaînes vides mais aussi None, 0, et des listes vides.
Par conséquent, il est crucial d'être précis dans son intention :

  • Accepter une chaîne même si elle est videif username is None:
  • La chaîne doit être présente mais peut être videif username != "":
  • Il ne doit pas y avoir de valeurif not username:

En résumé

None et "" ne sont pas identiques. Pourtant, tous deux ressemblent à False.
Connaître cette différence aidera à rendre vos intentions de code plus claires et sans bug.

Dans le prochain article, nous explorerons d'autres valeurs Falsy telles que 0, [], {} et examinerons plus en profondeur les différences entre is et == !