DEV Community

Cover image for Variables et la mémoire
Amel In Tech
Amel In Tech

Posted on

Variables et la mémoire

Sommaire

Ayant appris le C, je me suis naturellement demandé, lorsque j'ai commencé à apprendre Python, comment les variables et la mémoire y étaient gérées.

J'avais l'habitude de voir une variable comme une case mémoire contenant directement une valeur. En Python, le modèle est différent : une variable n'est pas une zone mémoire qui stocke une valeur, mais un nom qui référence un objet.

En Python, les variables permettent de donner un nom à une information pour pouvoir la réutiliser dans le programme.

Créer une variable

En Python, il n’y a pas de déclaration séparée de variable comme dans certains autres langages. Une variable existe à partir du moment où un nom reçoit une valeur.

variable  # ❌ le nom n’a jamais reçu de valeur

variable = "valeur"  # ✅ le nom reçoit une valeur
Enter fullscreen mode Exit fullscreen mode

Cette ligne fait deux choses en même temps :

  1. Python crée ou récupère l’objet "valeur".
  2. Python associe le nom variable à cet objet.

Mais que se passe-t-il réellement derrière cette instruction ? Et pourquoi ne peut-on pas créer une variable sans lui attribuer de valeur ?

Deux modèles mentaux : C et Python

En C, une variable peut être imaginée comme une case mémoire typée qui contient directement une valeur. La variable possède alors u n type, une adresse, une taille connue, et la valeur est stockée dans cette zone mémoire.

Exemple mental en C :

int age = 21;
Enter fullscreen mode Exit fullscreen mode

En Python, il faut faire attention au mot “stocker”, car le modèle mental est différent. En Python, une variable est un nom qui référence un objet Python en mémoire.

Objet et Référence

Dans le contexte des variables, un objet est un élément géré par l'interpréteur Python qui possède au minimum une valeur, un type et une identité.

Référencer un objet signifie que le nom de la variable permet de retrouver cet objet.

La variable ne contient pas directement l’objet, elle est liée à lui par une référence.

On peut imaginer cette référence comme une flèche entre le nom et l’objet.

💡

Référence = lien entre un nom de variable et un objet.

Exemple mental

age = 21
# age ─────► objet int contenant 21
Enter fullscreen mode Exit fullscreen mode


age = le nom de variable
21 = l’objet de type int
─────► = la référence entre le nom et l’objet
Enter fullscreen mode Exit fullscreen mode
valeur   → 21
type     → int
identité → un identifiant interne qui permet à Python de distinguer cet objet d’un autre
Enter fullscreen mode Exit fullscreen mode

Analogie :

En C :

la variable est une boîte qui contient une valeur
Enter fullscreen mode Exit fullscreen mode

En Python :

la variable est un nom qui pointe vers un objet
Enter fullscreen mode Exit fullscreen mode

En Python, l'étape consistant à déclarer une variable vide avant de lui attribuer une valeur n'existe pas. Une variable apparaît au moment où un nom est associé à un objet.

Si on essaye d’utiliser un nom qui n’a jamais reçu de valeur, Python lève une erreur :

Exemple :

print(message)
# => NameError: name 'message' is not defined
Enter fullscreen mode Exit fullscreen mode

💡

Si on veut représenter volontairement une absence de valeur, on utilise None.

message = None
# message ─────►  objet spécial None
Enter fullscreen mode Exit fullscreen mode

Ici, le nom message existe : il référence l’objet spécial None.

C’est différent d’un nom (variable) qui n’a jamais été défini.


Réassignation d’une variable

Réassigner une variable signifie réutiliser un nom déjà existant pour l’associer à un nouvel objet.

La réassignation ne modifie pas la valeur de l’ancien objet, elle change surtout l’association entre un nom et un objet.

Exemple :

age = 21
Au départ : age ─────► objet int contenant 21

age = 22
Après : age ─────► objet int contenant 22
Enter fullscreen mode Exit fullscreen mode
message = "Hello"
Au départ : message ─────► objet int contenant "Hello"

message = "Bonjour"
Après : age ─────► objet int contenant "Bonjour"
Enter fullscreen mode Exit fullscreen mode

Les nom age ou message ne références plus le même objet, ils références maintenant un nouvel objet.

Cas particulier : x = x + 1

x = x + 1 n’est pas un cas différent au niveau de la réassignation., c’est juste une réassignation où la nouvelle valeur dépend de l’ancienne.

Ici, la nouvelle valeur n’est pas écrite directement. Python doit d’abord la calculer.

exemple :

x = 10
# x ─────► objet int contenant 10

x = x + 1
# Calcul : x + 1 donne un nouvel objet int contenant 11#
# x ─────► objet int contenant 11
Enter fullscreen mode Exit fullscreen mode

Python fait les étapes suivantes :

  1. Il lit la valeur actuellement référencée par x.
  2. Il calcule x + 1.
  3. Il réassocie le nom x au résultat.

Cette ligne ne se lit pas comme une égalité mathématique, car en En Python, = ne compare pas il associe ou réassocie un nom à un objet. On parle alors opérateur d'affectation

Plusieurs noms peuvent référencer le même objet

En Python, une variable est un nom qui référence un objet, cela signifie que plusieurs noms différents peuvent référencer le même objet.

Exemple simple

a = 21
b = a
Enter fullscreen mode Exit fullscreen mode

On pourrait croire que Python copie simplement la valeur de a dans b, mais le modèle mental est plutôt :

  1. a = 21 ⇒ Python associe le nom a à un objet int contenant la valeur 21.
  2. b = a ⇒ Python regarde l’objet actuellement référencé par a, puis associe aussi le nom b à ce même objet.

    Il crée une nouvelle association entre un nom et un objet existant.

Les deux noms a et b référencent donc le même objet :

a ─────► objet int contenant 21
b ─────► même objet int contenant 21
Enter fullscreen mode Exit fullscreen mode

Réassigner un des deux noms

Si plusieurs noms référencent le même objet, puis qu’on réassigne un seul nom, ce nom change de référence, mais pas les autres noms. et donc on ne modifie pas automatiquement les autres noms.

Les autres noms continuent de référencer l’objet qu’ils référencaient déjà.

exemple :

message = "Hello"
# message    ─────► objet str contenant "Hello"

salutation = message
# salutation ─────► meme objet str contenant "Hello"

message = "Bonjour"
# message    ─────► objet str contenant "Bonjour"
# salutation ─────► ancien objet str contenant "Hello"
Enter fullscreen mode Exit fullscreen mode

message change de référence, mais salutation continue de référencer l’ancien objet.

Même valeur ≠ forcément même objet

Même valeur ne veut pas toujours dire même objet.Et None est un cas spécial du contraire

Deux variables peuvent avoir la même valeur sans forcément référencer le même objet.

Exemple simple :

a = 21
b = 21
**a référence un objet int contenant 21
b référence un objet int contenant 21**
Enter fullscreen mode Exit fullscreen mode

Ici, les deux objets peuvent avoir le même contenu, sans être forcément le même objet.

La question de savoir si deux objets identiques sont physiquement le même objet en mémoire dépend parfois d’optimisations internes de Python.

Même valeur ≠ forcément même objet.
Enter fullscreen mode Exit fullscreen mode

Cas particulier : None

None est un objet spécial qui représente l’absence volontaire de valeur.

Dans ce cas de l’exemple qui suit, a et b référencent le même objet spécial None :

a = None
# a ─────► objet spécial None

b = None
# b ─────► même objet spécial None
Enter fullscreen mode Exit fullscreen mode

Déclarer plusieurs variables en une seule ligne

En Python, on peut associer plusieurs variables à plusieurs valeurs en une seule ligne.

prenom, nom_famille = "Alice", "Martin"
Enter fullscreen mode Exit fullscreen mode

Revient à écrire :

prenom = "Alice"
nom_famille = "Martin"
Enter fullscreen mode Exit fullscreen mode

Ici :

prenom
→ référence l’objet "Alice"

nom_famille
→ référence l’objet "Martin"
Enter fullscreen mode Exit fullscreen mode

Exemple avec split()

nom = "Alice Martin"

prenom, nom_famille = nom.split(" ")

print(prenom)       # Alice
print(nom_famille)  # Martin
Enter fullscreen mode Exit fullscreen mode

Ici, nom.split(" ") découpe la chaîne "Alice Martin" en deux morceaux , puis Python associe chaque valeur à une variable.

Un peu de pratique

Essayez de prédire le résultat avant d'exécuter le programme :

a = "Bonjour"
b = a

a = "Salut"

print(a)
print(b)
Enter fullscreen mode Exit fullscreen mode

Résumé en images

Top comments (0)