HOWTO · Python

Comment déclarer une variable sans valeur en Python

Découvrez comment Python traite un nom non lié, un espace réservé `None`, une annotation sans affectation, ainsi que des valeurs de chaîne ou de liste vides.

Sur cette page

Pour préparer une variable à une valeur que vous fournirez plus tard, affectez None comme espace réservé. Python ne lie un nom que lorsqu’une affectation s’exécute ; le simple fait de mentionner un nom ou d’écrire une annotation ne lui donne pas de valeur d’exécution. Utilisez une annotation de variable lorsque vous devez enregistrer un type sans rien affecter, ou affectez une chaîne ou une liste vide lorsque c’est la valeur par laquelle vous souhaitez commencer.

Comment Python gère une variable sans valeur affectée

En Python, l’affectation crée une liaison entre un nom et un objet. Un nom qui n’a pas été affecté dans la portée actuelle est non lié. Le lire lève NameError ; ce n’est pas une variable contenant une valeur spéciale « rien ». Cette distinction est importante lorsque vous choisissez comment représenter des données qui seront fournies plus tard.

Les options ci-dessous créent des états différents : None est un espace réservé affecté, une annotation enregistre des informations de type sans affecter de valeur, et une chaîne ou une liste vide est un objet affecté qui peut être utilisé immédiatement.

Affecter None comme espace réservé

Affectez None lorsque le nom doit exister maintenant, mais que la valeur significative n’est pas encore disponible. None est l’objet singleton de Python pour représenter l’absence ; l’affecter lie le nom, ce qui est donc différent de laisser le nom non lié. Testez-le avec is None.

Exécutez cet exemple complet pour comparer les trois choix :

profile = None
message = ""
items = []

if profile is None:
    profile = {"name": "Ada"}

message += "Hello"
items.append("first")

print(profile["name"])
print(message)
print(items)

Après le test, profile fait référence à un dictionnaire. Une valeur par défaut de paramètre None distingue un argument omis d’une valeur fournie qui n’est pas None, car la valeur fournie remplace la valeur par défaut. Elle ne peut pas distinguer l’omission d’un None explicite ; utilisez un objet sentinelle unique comme valeur par défaut lorsque ces appels doivent être traités différemment.

Utiliser une annotation de variable sans affecter de valeur

Une annotation de variable peut enregistrer le type prévu sans lier de valeur d’exécution au nom :

name: str

Ceci est une annotation, pas une affectation. L’annotation peut être disponible via les données d’annotation du module ou de la classe qui la contient, mais lire name avant de lui affecter une valeur lève toujours NameError. Si le code ultérieur doit lire la valeur, affectez-en d’abord une, comme name = "Ada". Utilisez la syntaxe d’annotation seule lorsqu’il est utile de documenter le type prévu et que l’affectation doit avoir lieu ailleurs.

Utiliser une chaîne ou une liste vide lorsqu’une valeur vide est voulue

Affectez une valeur vide lorsqu’elle est déjà la valeur de départ correcte pour votre tâche. Une chaîne vide reste une chaîne, et une liste vide reste une liste ; ni l’une ni l’autre ne représente un nom non lié ou un espace réservé None.

L’exemple ci-dessus commence message comme une chaîne vide et items comme une liste vide, puis ajoute du contenu. Choisissez le type qui correspond aux données que vous prévoyez de stocker. Une liste peut être remplie plus tard avec des méthodes telles que append() ou extend().

Choisir la forme qui correspond à votre intention

  • Utilisez None lorsque l’absence est significative et que le nom doit déjà être lié. Testez-le avec is None avant de remplacer ou d’utiliser l’espace réservé.
  • Utilisez une annotation telle que name: str lorsque vous devez enregistrer le type prévu mais ne souhaitez pas affecter de valeur à ce stade. Elle ne rend pas le nom lisible à l’exécution.
  • Utilisez "" ou [] lorsqu’une chaîne ou une collection vide est la valeur initiale réelle dont votre code a besoin.

Si une lecture lève NameError, vérifiez d’abord si une affectation s’est exécutée dans cette portée. Affectez None si vous avez besoin d’un espace réservé, ou initialisez la valeur que votre code utilisera. N’utilisez pas la syntaxe d’annotation seule comme substitut à l’initialisation à l’exécution.