Les variables – Python

Qu’est-ce qu’une variable ?

Le contenu d’une variable est sa valeur. Il s’agit forcément d’une instance d’un objet, stockée en mémoire. Celle-ci est donc reliée à une classe. Le type de l’instance est le nom de sa classe.

Par exemple 42 est une instance de la classe int, elle est de type int :

Toute opération réalisée sur une variable l’est sur sa valeur.

Le contenant n’est rien d’autre que l’association d’un nom et d’un pointeur vers le contenu, soit la valeur associée à ce nom.

L’affectation est l’opération qui permet d’associer un contenu (opérande de droit) à un contenant (opérande de gauche) et donc d’associer un nom avec un pointeur vers une valeur.

Ainsi, l’utilisation de ce nom renvoie systématiquement la valeur associée :

L’unique moyen de supprimer cette association entre contenu et contenant est de supprimer l’association entre le nom et le pointeur :

Le contenant n’existe alors plus, et il n’est plus possible d’utiliser le nom de variable :

Le fait que le contenant n’existe plus ne signifie pas forcément que le contenu associé n’existe plus également, car si un contenant n’est associé qu’à un seul contenu, un contenu peut être associé à plusieurs contenants.

Pour savoir si les contenants pointent vers le même contenu, il faut procéder ainsi :

Voici donc un exemple ou un contenant est supprimé, mais pas le contenu :

Lorsque tous les contenants pointant vers un contenu sont supprimés, le contenu devient inaccessible dans le sens où il ne reçoit plus aucun pointeur.

Cela ne signifie pas pour autant qu’il est immédiatement supprimé, puisque cette opération est réalisée par le ramasse-miettes de la machine virtuelle de Python.

Le nommage des contenants doit suivre certaines règles qui sont en partie imposées, en partie tacites.

Tous les mots-clés (les trente instructions + None + True + False) vus au chapitre précédent ne sont pas utilisables en tant que noms de variable (erreur détectée par l’analyse lexicale) :

Une telle erreur est immédiatement détectée. Par contre, il est possible d’utiliser des mots réservés, c’est-à-dire que le langage utilise déjà :

Par contre, ce faisant, on s’expose à rencontrer des erreurs qui se produisent de manière logique. En effet, si un peu plus loin dans le code, on veut convertir un n-uplet en liste comme ceci, on aura :

Ce type d’erreur est plus insidieux, puisque non détecté lors de l’analyse lexicale étant donné que list n’est pas un mot-clé, mais seulement un mot réservé.

En effet, Python suppose que vous savez ce que vous faites et que si vous remplacez la fonction list, c’est que vous la remplacez par un équivalent et que vous le faites dans les règles de l’art.

Elle n’est pas non plus détectée par les autres mécanismes et pour cause puisque le développeur peut réellement vouloir remplacer la classe list existante par une classe personnalisée et une des forces de Python consiste justement à permettre ce genre de possibilités.

Tout repose donc sur la bonne utilisation des noms de variables par le développeur et la philosophie même de Python consiste à faire confiance au développeur et à lui donner le maximum de clés.

Sur une console, le moyen de revenir en arrière sur ce genre d’erreurs est de retourner chercher la variable depuis le module builtins :

Attention, avec Python 2, il faut procéder ainsi :

 

Laisser un commentaire