Guide Complet sur la Portée des Variables en Python pour les Débutants

Bonjour à toi, aspirant Pythonista ! ? Es-tu prêt à plonger dans le monde fascinant de la portée des variables en Python ? Ne t'inquiète pas si cela paraît intimidant ; à la fin de ce tutoriel, tu seras un maître de la portée ! Commençons ce voyage passionnant ensemble.

Python - Variables Scope

Types de Portée pour les Variables en Python

Avant de nous plonger dans les détails, comprenons ce que signifie "portée" en Python. Imagine que tu es dans une grande maison avec différentes pièces. Chaque pièce a ses propres règles et objets. En Python, ces pièces sont comme des scopes différents, et les objets sont nos variables.

Python a trois principaux types de portée de variables :

  1. Portée Locale
  2. Portée Globale
  3. Portée Non Locale

Explorons chacun de ces types en détail.

Variables Locales

Les variables locales sont comme tes biens personnels dans ta chambre. Elles ne sont accessibles qu'à l'intérieur d'une fonction spécifique ou d'un bloc de code.

def saluer_l'utilisateur():
nom = "Alice"  # Cette variable est locale
print(f"Bonjour, {nom} !")

saluer_l'utilisateur()  # Sortie : Bonjour, Alice !
print(nom)  # Cela lèvera une NameError

Dans cet exemple, nom est une variable locale à l'intérieur de la fonction saluer_l'utilisateur(). C'est comme l'étiquette de nom d'Alice qui n'existe que dans la pièce de la fonction. Quand nous essayons de l'accéder en dehors de la fonction, Python dit, "Désolé, je ne connais pas de 'nom' ici !"

Variables Globales

Les variables globales sont comme les règles de la maison affichées sur le réfrigérateur - elles sont accessibles de n'importe où dans le programme.

nom_de_maison = "Python Palace"  # Cette variable est globale

def message_de_bienvenue():
print(f"Bienvenue à {nom_de_maison} !")

message_de_bienvenue()  # Sortie : Bienvenue à Python Palace !
print(nom_de_maison)  # Sortie : Python Palace

Ici, nom_de_maison est notre variable globale. C'est comme le nom de notre maison que tout le monde peut voir et utiliser, que ce soit dans la cuisine, le salon ou n'importe quelle fonction de notre programme.

Mais que faire si nous voulons modifier une variable globale à l'intérieur d'une fonction ? C'est là que le mot-clé global est utile :

compteur = 0  # Variable globale

def incrementer_compteur():
global compteur
compteur += 1
print(f"Le compteur est maintenant : {compteur}")

incrementer_compteur()  # Sortie : Le compteur est maintenant : 1
incrementer_compteur()  # Sortie : Le compteur est maintenant : 2

En utilisant global compteur, nous disons à Python, "Eh, je veux utiliser le compteur de la maison, pas créer un nouveau dans cette pièce !"

Variables Non Locales

Maintenant, imagine que tu es dans une chambre d'invité à l'intérieur de la chambre principale. Tu peux accéder aux choses dans la chambre d'invité (portée locale) et à certaines choses de la chambre principale (portée non locale), mais pas à tout de la maison entière (portée globale).

def fonction_exterieure():
x = "extérieur"

def fonction_interieure():
nonlocal x
x = "intérieur"
print("Intérieur :", x)

fonction_interieure()
print("Extérieur :", x)

fonction_exterieure()
# Sortie :
# Intérieur : intérieur
# Extérieur : intérieur

Dans ce scénario de fonction imbriquée, nonlocal x permet à la fonction intérieure de modifier la variable de la fonction extérieure (enveloppante).

Espace de Noms et Portée des Variables Python

Pense à un espace de noms comme un grand dictionnaire où Python garde toutes ses variables. Chaque portée a son propre espace de noms.

x = 10  # Espace de noms global

def exterieure():
y = 20  # espace de noms de exterieure()

def interieure():
z = 30  # espace de noms de interieure()
print(x, y, z)

interieure()

exterieure()  # Sortie : 10 20 30

Cet exemple montre comment Python recherche des variables dans différents espaces de noms, en partant du scope le plus intérieur et en se déplaçant vers l'extérieur.

Fonction globals() en Python

La fonction globals() est comme un miroir magique qui te montre toutes les variables globales de ton programme.

x = 10
y = "bonjour"

print(globals())
# Sortie : {..., 'x': 10, 'y': 'bonjour', ...}

Elle retourne un dictionnaire contenant toutes les variables globales. C'est super utile pour le débogage !

Fonction locals() en Python

De manière similaire, locals() te montre toutes les variables locales dans le scope actuel.

def montrer_locaux():
a = 5
b = "monde"
print(locals())

montrer_locaux()
# Sortie : {'a': 5, 'b': 'monde'}

Cette fonction est géniale pour jeter un œil à quelles variables sont disponibles dans ta "pièce" actuelle.

Conflit d'Espace de Noms en Python

Parfois, les variables dans différents scopes peuvent avoir le même nom, conduisant à un conflit d'espace de noms. Python résout cela en utilisant la règle LEGB : Local, Enclosing, Global, Built-in.

x = "global"

def exterieure():
x = "extérieur"

def interieure():
x = "intérieur"
print("Intérieur x :", x)

interieure()
print("Extérieur x :", x)

exterieure()
print("Global x :", x)

# Sortie :
# Intérieur x : intérieur
# Extérieur x : extérieur
# Global x : global

Dans cet exemple, chaque scope a son propre x, et Python utilise celui qui est le plus proche de l'endroit où il est appelé.

Voici un tableau résumant les fonctions clés que nous avons discutées :

Fonction Description Exemple
globals() Retourne un dictionnaire des variables globales print(globals())
locals() Retourne un dictionnaire des variables locales print(locals())
global Déclare une variable globale à l'intérieur d'une fonction global x
nonlocal Déclare une variable non locale à l'intérieur d'une fonction imbriquée nonlocal y

N'oublie pas, comprendre la portée des variables est comme apprendre la disposition d'une nouvelle maison. Cela peut sembler confus au début, mais avec de la pratique, tu navigueras dans ces "pièces" comme un pro ! Continues à coder, à explorer, et n'hésite pas à expérimenter. Après tout, la meilleure façon d'apprendre Python est en le faisant. Bon codage ! ?✨

Credits: Image by storyset