Gestion des variables




Cette page concerne les variables simples (on dit aussi atomiques ou élémentaires, en anglais scalar), à savoir les nombres (réels ou complexes), lettres, symboles, et autres valeurs booléennes (True ou False). Le cas des collections et des classes d’objets personnalisées sera traité chacun dans la page de mêmes noms.

Aller à Les différents types de variables, La gestion des variables en mémoire, Valeurs identiques vs adresses identiques
 

Les différents types de variables

 
Python permet d’affecter des valeurs aux variables sans avoir auparavant déclaré explicitement leur type. Le type de la variable est donné par le format adopté pour la valeur.
Qu’entend t’on par format ?
Un exemple: on peut donner la même valeur 1 à deux variables, mais en ajoutant un séparateur (le point ‘.’) après la valeur 1 pour une de ces variables (autrement dit 1.), on précise que celle-ci fait référence à des valeurs décimales (ou réels flottants)
Concrètement,

a=1 # a est un entier (type int)
b=1. # b est une valeur décimale (type float avec beaucoup de chiffres après la virgule)

Dans les versions 2., pour spécifier un type entier long (long, on fera suivre la valeur par la lettre L
 

 
Les types de base sont récapitulés dans le tableau ci-dessous

Type Exemple Signe
int,long n=100 aucun
int,long m=0x120 (=1*16²+2*16+0=288) aucun
long (version 2.) m=100000000L (ou m=100000000l) L ou l à la fin
float x=100. (ou 100.0) Point décimal
float x=e12. (ou 10**12) Notation exponentielle
str s= ‘ h ’ ou s= " h " entre guillemets ou apostrophes
boolean z=True ou False 2 valeurs possibles
complex z=a+bj (ou a+bJ) Pas d’espace entre b et j

Gestion des variables en mémoire

 
En Python, une variable n’existe pas tant qu’aucune valeur ne lui a été attribuée par le programmeur, ce qui différencie ce langage des autres langages courants. Par exemple, en C, (comme en VBA), des valeurs par défaut sont données aux variables au moment de leur création

Code C
int a; int b;
cout << a << " " << b;
0 1
a=1; b=1;
cout << a << " " << b;
1 1

La déclaration ou la manipulation d’une variable sans affectation de valeur déclenche en Python des messages d’erreur
 

 
Tout se passe comme si Python ne pouvait traiter que des données existant physiquement en mémoire, c’est à dire, pour employer une terminologie informatique, des objets. Dans un script, c’est l’objet qui permet l’existence de la variable et non la variable qui crée l’objet. C’est pour cela qu’on compare souvent l’interpréteur Python à une calculette, car on peut effectuer un traitement sans faire intervenir de variables

 

 
Tout ce qui peut être évalué est appelé expression. Par exemple, la formule au-dessus 3*sin(1)/(1+2.5**2) en est une.
Le résultat obtenu est conservé, comme dans les calculatrices, même si il n’est pas attribué à une variable.

Comment connaître l’emplacement d’une valeur en mémoire ?
 
L’emplacement d’une valeur en mémoire est donnée par son adresse. Certains langages permettent d’accéder à cette adresse. Par exemple, en C, l’adresse de la valeur d’une variable a est notée &a. Quand la valeur de a change, c’est la nouvelle qui prend la place de l’ancienne à la même adresse.

Code C
int a; int b;
cout << a << " " << b;
0 45
cout << &a << " " << &b;
0x22fe3c 0x22fe38
a=1; b=1;
cout << &a << " " << &b;
0x22fe3c 0x22fe38

L’adresse d’une valeur est accessible avec la distribution standard Cpython via la fonction id qui renvoie une adresse au format long.
Contrairement à ce qui se passe en C, Java ou VBA, quand on modifie sa valeur, la variable change d’adresse: cela confirme que la création de l’objet (une donnée présente en mémoire) précède celle de la variable. Pour faire une analogie très simpliste, l’objet serait comme une habitation, et la variable serait le nom de l’occupant. La contrainte qui oblige une variable à changer d’adresse en changeant de valeur, est appelée immutabilité, terme un peu barbare (sauf aux juristes), directement transcrit de l’anglais. L’analogie ne s’arrête pas là: de même qu’une habitation peut avoir plusieurs occupants, plusieurs variables peuvent partager la même adresse.
 

 
Rappelons que, dès qu’il a évalué une expression, Python place sa valeur en mémoire: confirmation dans l’exemple ci-dessous

 

 
Sur la durée de vie de cette valeur en mémoire, on peut s’interroger:
est-elle effacée si aucune variable ne pointe vers elle ?
Oui, a priori
peut-elle être « déplacée » pour optimiser la gestion de mémoire ?
Oui, tout au moins en ce qui concerne les variables de type séquence que nous allons étudier dans la section suivante.

Valeurs identiques vs Adresses identiques

 
En python, l’opérateur qui permet de savoir si deux variables contiennent la même valeur est l’opérateur de comparaison == (voir § les opérateurs).
Pour savoir si deux variables partagent la même adresse, on utilise l’opérateur is
Nous avons vu au paragraphe précédent que les variables simples étaient immutables, i.e. un changement de valeur entraîne un changement d’adresse. Cela implique t’il que deux variables simples ayant la même valeur ont forcément la même adresse ?
En ce qui concerne les nombres complexes, la réponse est non.
En ce qui concerne les valeurs numériques, cela dépend de la version de python. Les versions 2.7 et 3.4 étant caractéristiques des distributions 2. et 3., elles serviront de références pour la comparaison:

Dans la version 3.4, c’est oui, à condition que le type des deux variables soit identique
 

 
Lorsque deux variables sont initialisées à l’aide de deux expressions (formule à évaluer), elles ont deux adresses différentes, même si les expressions désignent des valeurs identiques
 

 
Dans la version 2.7, c’est oui, seulement jusqu’à 256 (28)

 
En ce qui concerne les caractères, lettres ou symboles, en tout cas pour les plus courants, c’est oui quelle que soit la version.
Tout ceci est valable, rappelons-le, uniquement pour les variables simples, donc ne s’applique pas aux objets de type collection.