Affectation d’une variable en Python: comment ça marche? Une fois n’est pas coutume, je vais mettre les mains dans le cambouis et sortir de l’aspect théorique de la programmation pour border l’aspect pratique.
Vous pouvez voir cet article en complément des ressources Python pour le lycée proposées sur ce site.
Affectation d’une variable en Python : cas simples
Une première affectation d’une variable
Prenons l’exemple trivial suivant:
a = 3
Python va créer un espace mémoire dans lequel il va stocker la valeur « 3 ». À ce niveau Python aura deviné que l’objet qu’il stocke en mémoire est de type entier (int) et va lui allouer un espace mémoire en conséquence (ça serait bien con de réserver trop d’espace mémoire pour un ch’ti entier non?). On dit que Python est un langage au typage dynamique.
Ensuite, il va créer un lien entre cet espace mémoire et le nom « a ».
Une seconde affectation
Considérons maintenant les lignes suivantes:
a = 3 a = 2
La ligne 1 va créer un espace mémoire dans lequel est mis l’entier « 3 », puis un lien entre le nom de la variable et cet espace.
La ligne 2 va créer un second espace mémoire dans lequel est stocké l’entier « 2 », puis détruire le lien qu’il y avait auparavant pour en créer un autre qui lie le nom de la variable et le second espace mémoire.
Qu’advient-il du premier espace mémoire ? Et bien Python peut le supprimer comme le garder.
Trois affectations
Allons plus loin et considérons le script suivant:
a = 3 a = 2 b = a
Nous avons vu ce qui se passait pour les lignes 1 et 2.
La ligne 3, quant à elle, va créer un lien entre le nom de la variable « b » et l’espace mémoire dans lequel est stocké l’entier « 2 ».
Deux affectations d’une même valeur
Considérons le script suivant:
a = 3 b = 3
Là, Python peut se comporter de deux manières différentes :
- la première possibilité est qu’il crée un espace mémoire dans lequel il stocke l’entier « 3 », puis qu’il crée deux liens : l’un pour « a », l’autre pour « b »;
- la seconde possibilité est qu’il crée deux espaces mémoires distincts dans lesquels il stocke le même entier « 3 », puis qu’il crée deux liens : l’un pour « a » (vers le premier espace mémoire), l’autre pour « b » (vers le second espace).
Affectation d’une variable en Python: cas des listes
Premier exemple basique d’une affectation d’une variable en Python dans le cas des listes
L = [ 1 , 2 ]
Dans ce cas, Python crée deux espaces mémoires dans lesquels il stocke respectivement les entiers « 1 » et « 2 », puis il crée dans la mémoire un espace dans lequel il stocke une liste de deux éléments: le premier élément de cette liste va être relié au premier espace mémoire (qui contient « 1 ») et le second va être relié au second espace mémoire (contenant « 2 »).
Pour en savoir plus sur les types de variables, vous pouvez consulter par exemple ce cours de openclassrooms.
Un lien sera ensuite créé entre le nom « L » est l’espace mémoire alloué à la liste.
Deux listes liées
L = [ 1 , 2 ] M = L M[0] = 7 M = M.append(8)
Nous avons vu précédemment ce qui se passait pour la ligne 1.
À la ligne 2, Python crée un lien entre le nom « M » et l’espace mémoire alloué à la liste déjà créée. Ainsi, à la ligne 3, un espace mémoire se crée dans lequel est mis l’entier « 7 », puis le lien déjà existant du premier élément de la liste créée en ligne 1 va être rompu et remplacé par un nouveau lien pointant vers l’espace mémoire contenant « 7 ».
On remarque alors que la substitution faite dans la liste M a aussi un impact sur la liste L. C’est la raison pour laquelle il ne faut surtout pas copier une liste dans une autre en utilisant l’opérateur « = ».
Intéressons-nous maintenant à la ligne 4, qui ajoute à la liste M la valeur 4. Ici, un espace mémoire est créé dans lequel Python stocke l’entier « 8 ». Puis l’espace mémoire alloué à la liste sera modifié pour contenir un élément de plus. Cet élément qui va pointer sur l’espace mémoire contenant « 8 »:
Différence entre append(8) et +[8]
Il existe une autre syntaxe pour ajouter un élément à une liste :
M += [ 8 ]
Que se passe-t-il dans ce cas ? Un espace mémoire est créé dans lequel l’entier « 8 » est stocké (comme précédemment). Mais un autre espace mémoire est créé pour stocker une liste de 3 éléments: les deux éléments de M déjà mentionnés précédemment, et celui que l’on ajoute.
Cette syntaxe demande donc plus de mémoire que la méthode append().