False en Python : la valeur fausse d'un booléen

False est l'une des deux valeurs du type booléen en Python. Elle vaut zéro, et beaucoup d'autres valeurs sont fausses sans lui être égales.
6 min de lecture
Believemy logo

Définition

Un programme passe son temps à trancher : ce panier est-il vide, cet utilisateur a-t-il payé ? Pour répondre, il faut un type de donnée qui ne connaisse que deux réponses et aucune nuance entre les deux. C'est le type booléen, et False en est la réponse négative, True étant la réponse positive.

False représente donc ce qui n'est pas le cas : une comparaison qui ne se vérifie pas, une case non cochée, une vérification qui échoue. C'est un mot-clé réservé du langage, écrit avec une majuscule et sans guillemets. Réservé veut dire confisqué : le nom appartient à Python, et vous ne pouvez pas le réutiliser comme variable.

PYTHON
stock = 0

# Une comparaison ne renvoie jamais autre chose qu'un booléen
print(stock > 10)
# False

# Ici la valeur est écrite à la main, sans passer par un test
est_actif = False
print(type(est_actif))
# <class 'bool'>

Retenez la première moitié de cet exemple : toute comparaison produit l'une de ces deux valeurs, et rien d'autre. Vous n'avez donc jamais à fabriquer un booléen pour écrire une condition, le test s'en charge, et Python exécute le bloc uniquement si le résultat ne se ramène pas à faux.


False, et tout ce qui se comporte comme faux

« Se ramener à faux » cache une souplesse qui surprend. Python n'exige pas un vrai booléen dans un test : il accepte n'importe quelle valeur, puis décide lui-même si elle compte comme vraie ou comme fausse. Il faut donc séparer la valeur False d'un côté, et de l'autre les valeurs simplement traitées comme fausses.

Elles sont assez peu nombreuses pour être apprises par cœur. Le tableau les liste toutes, puis se termine par trois valeurs que l'on croit fausses à tort.

ValeurDans un test
FalseFausse, c'est le booléen lui-même
NoneFausse, mais signifie l'absence de valeur
0 et 0.0Fausses, les zéros numériques
""Fausse, la chaîne vide
[], {}, set()Fausses, les collections vides
"0", [0], " "Vraies, car elles ne sont pas vides

La dernière ligne est le piège classique. La chaîne "0" contient un caractère, elle n'est donc pas vide, elle est donc vraie, alors même que sa lecture suggère l'inverse.

Attention

Dans un formulaire, les données arrivent toutes sous forme de chaînes. Un champ où l'utilisateur a saisi 0 vous parvient donc en "0", qui est vrai : le test if saisie: le laisse passer comme une valeur ordinaire. Convertissez la saisie avant de la tester, sinon une quantité nulle sera traitée comme une quantité normale.

Cette souplesse n'est pourtant pas un défaut, et vous l'utiliserez tous les jours. Elle permet d'écrire if resultats: plutôt que de comparer à zéro une longueur obtenue avec len. Le test se lit alors « s'il y a des résultats », ce qui est exactement l'intention de départ.


False vaut zéro, littéralement

Le type booléen n'est pas un type à part : il dérive du type int. False vaut donc 0 et True vaut 1, y compris au milieu d'une addition. Loin d'être une curiosité de langage, c'est une technique de comptage que les développeurs emploient tous les jours.

L'exemple qui suit compte les bonnes réponses d'un questionnaire sans écrire la moindre boucle.

PYTHON
reponses = [True, False, True, True]

# sum() additionne les booléens comme des 1 et des 0
print(sum(reponses))
# 3

print(False == 0)
# True

La contrepartie apparaît à la dernière ligne. Puisque False == 0 renvoie vrai, aucune égalité simple ne vous dira si vous tenez un booléen ou un entier. Quand la distinction compte, interrogez le type plutôt que la valeur.

Bon à savoir

L'équivalence vaut aussi pour les clés d'un dictionnaire. {0: "a", False: "b"} ne crée pas deux entrées mais une seule, qui vaut "b" : Python y voit la même clé et écrase la première.


Ne le comparez pas explicitement

Reste une question de style, qui se révèle vite être une question de justesse. Écrire if valide == False: fonctionne, mais aucun développeur Python ne formule les choses ainsi. La forme attendue passe par not, qui inverse la valeur de vérité de ce qu'on lui donne.

PYTHON
# Lourd, et ne repère que False exactement
if valide == False:
    ...

# Attendu, et se lit « si valide ne tient pas »
if not valide:
    ...

Le défaut n'est pas seulement esthétique. La comparaison ne réagit qu'à la valeur False exactement, et laisse donc passer une liste vide, une chaîne vide ou une absence de valeur, qui auraient toutes dû être écartées de la même façon. La forme avec not s'appuie sur les règles du tableau plus haut et couvre ces trois cas d'un seul geste.

Quant à is False, il ne compare pas les valeurs mais les identités. Il ne se justifie que dans le cas rare où un faux booléen doit être distingué d'un zéro, typiquement une fonction qui renvoie tantôt 0, tantôt False, tantôt None.


Questions fréquentes

Question

Pourquoi false en minuscules provoque-t-il une erreur ?

Parce que Python est sensible à la casse et ne connaît que False avec une majuscule. Écrit en minuscules, le mot n'est plus un mot-clé mais un nom ordinaire, que rien n'a jamais défini : l'exécution s'arrête sur une NameError. Les habitués de JavaScript ou de PHP, où la minuscule est la règle, y passent à peu près tous.

Question

Quelle différence avec une liste vide dans un test ?

Aucune du point de vue du résultat, puisque les deux sont fausses dans un if. La différence est de sens : False affirme une réponse négative, alors qu'une liste vide affirme qu'il n'y a rien à traiter. La confusion devient coûteuse dès qu'une fonction peut renvoyer l'un ou l'autre, car celui qui l'appelle ne sait plus s'il a reçu un échec ou un résultat vide.

Question

Comment obtenir False à partir d'une autre valeur ?

En appelant bool() sur cette valeur, ce qui applique exactement les règles du tableau plus haut : bool("") et bool([]) renvoient False. C'est utile pour enregistrer une réponse en base de données, où l'on veut un vrai booléen et non une chaîne vide, et c'est aussi ce que Python fait de lui-même à chaque test. La formation Python revient longuement sur ces conversions implicites, qui produisent les bugs les plus discrets du langage.

Termes connexes

Découvrez notre glossaire Python

Parcourez les termes et définitions les plus couramment utilisés dans le domaine du développement avec Python.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.