L'objet None en Python

L'objet None est l'une des caractéristiques les plus importantes de Python.

Il est utilisé pour représenter la valeur d'une variable qui ne contient rien, ou qui n'a pas été initialisée.

Dans cet article, nous allons comprendre son utilité et son fonctionnement.

Définition et utilité de l'objet None

L'objet None est défini comme la représentation de l'absence de valeur.

L'objet None est également utilisé pour signifier l'achèvement d'une fonction sans retour.

def foo():
    a = 5

resultat = foo()
print(resultat)  # None

Vous remarquerez que même si nous n'utilisons pas l'instruction return, la fonction retourne par défaut la valeur None.

Le type de l'objet None

À l'inverse de la plupart des objets en Python, l'objet None est une instance de la classe NoneType et non de la classe object.

None est ce qu'on appelle un singleton, c'est-à-dire qu'il n'existe qu'une seule et unique instance de la classe NoneType.

Petite explication avec du code :

>>> a = None
>>> b = None
>>> print(id(a))
4534110080
>>> print(id(b))
4534110080  # L'identifiant de b est identique à a

Comparaisons avec l'objet None

Il est important de comprendre que l'objet None n'est pas équivalent à zéro, à une chaîne vide ou à une liste vide.

None est une valeur spéciale qui représente l'absence de valeur, alors que zéro, une chaîne vide ou une liste vide ont des significations spécifiques.

x = None
y = 0
z = ""

if x == y:
    print("x est égal à y")
else:
    print("x n'est pas égal à y")

if x == z:
    print("x est égal à z")
else:
    print("x n'est pas égal à z")

Le programme va afficher :

"x n'est pas égal à y"
"x n'est pas égal à z"

De même, il est important de comprendre que None n'est pas égal à False mais que si vous utilisez None dans une expression booléenne, elle se comportera comme False.

N'hésitez pas à relire cette phrase une deuxième fois 😄

Un exemple de code sera probablement plus facile à comprendre :

x = None

if x:  # équivalent de "if bool(None):"
    print("x est True")
else:
    print("x est False")

if x == False:
    print("x est égal à False")
else:
    print("x n'est pas égal à False")

if x is None:
    print("x est définie à None")
else:
    print("x n'est pas None")

Dans la première structure conditionnelle, l'interprétation booléenne de None est égale à False :

print(bool(None))  # False

C'est pour cette raison que if x n'est pas vérifié et qu'on affiche "x est False".

Cependant, on se rend bien compte quand on utilise l'opérateur d'égalité (==) que la variable x n'est pas égale à False.

Dans le cas de la troisième structure conditionnelle, en utilisant l'opérateur is, Python nous indique bien que la variable x représente l'objet None.