Aller au contenu

Portée des variables

Une variable présente dans le texte d'un programme n'est pas nécessairement accessible partout.

Dans ce chapitre, nous illustrerons ce principe au travers des notions déjà abordées jusqu'à présent, à savoir :

  • L'affectation de variable ;
  • Les variables globales et les variables locales ;
  • Les types muables et immuables ;
  • Les effets de bord des fonctions.

Affectation

Lorsqu'on affecte la valeur 3 à la variable a en Python, un objet de type int et de valeur 3 est créé.

L'affectation :

>>> a = 3
peut être schématisé par la création d'un objet de type int et de valeur 3 auquel on accole l' « étiquette » (le nom) a (cf. dessin ci-contre).

Attention

Les instructions :

>>> a = 3
>>> a = a + 6
déplacent l'étiquette (le nom) vers un nouvel objet de type int recevant la valeur 3+6. On peut illustrer ce principe à l'aide du schéma suivant :

Important

Il faut comprendre que toute affectation crée un nouvel objet (une nouvelle boîte dans la partie « objets ») : ce n'est pas la première boîte qui reçoit une nouvelle valeur.

La première boîte existe toujours a priori mais c'est comme si elle n'existait plus : elle n'a plus d'étiquette, elle n'est donc plus accessible pour le programmeur (tout se passe comme si elle n'existait plus)

Compléments et vérification

Pour s'y retrouver entre les différents objets créés par un programme, Python leur affecte un numéro d'identification qu'il est possible de consulter en utilisant la fonction id(). Cette fonction renvoie un entier que l'on peut interprêter comme l'adresse en mémoire de cet objet.

Testez les instructions suivantes dans la console pour vous en convaincre (bien évidemment, les valeurs renvoyées par la fonction id() seront différentes sur votre machine).

>>> a = 3

>>> id(a)
8791620948864

>>> a = a + 6

>>> id(a)
8791620949056

Cas usuel

On considère les instructions suivantes :

>>> a = 3
>>> b = a + 6
Le schéma devient :

  • En ligne 1, création d'un objet de type int recevant la valeur 3 et auquel on accole l'étiquette a:
  • En ligne 2, il y a tout d'abord la création d'un nouvel objet de type int recevant la valeur 3+6 :
  • Puis on accole à cet objet l'étiquette b:

Dans ce cas, les deux boîtes ont toujours une étiquette : elles sont toutes les deux accessibles.

Cas particulier : affectation d'étiquette

Lorsqu'il n'y a pas de calcul dans la partie droite de l'affectation, Python ne crée pas de nouvel objet mais ajoute simplement une nouvelle étiquette à cet objet.

Les instructions suivantes :

1
2
a = 3
b = a
se schématisent ainsi:

  • En ligne 1, création d'un objet de type int recevant la valeur 3 et auquel on accole l'étiquette a:
  • En ligne 2, ajout d'une étiquette b sur l'objet existant.

Nous verrons plus loin que ce comportement sera important à comprendre pour des objets plus complexes que les int et les float (pour les chaînes, les listes, les tuples notamment).

Vérification avec id()
>>> a = 3

>>> id(a)
8791620948864

>>> b = a

>>> id(b)
8791620948864