
Portée des variables (scope) et espace de noms
Découvrez les concepts de portée des variables (locale, globale, non locale) et d'espaces de noms en Python. Apprenez à utiliser les mots-clés global et nonlocal, et comprenez la règle LEGB pour éviter les erreurs liées à la portée.
Variables locales et variables globales : deux portées différentes
La portée d'une variable (ou scope) détermine où cette variable est accessible dans votre code. En Python, il existe principalement deux types de portée : la portée locale et la portée globale.
Une variable locale est une variable définie à l'intérieur d'une fonction. Elle n'est accessible qu'à l'intérieur de cette fonction. Une fois que la fonction se termine, la variable locale est détruite et sa valeur est perdue.
Une variable globale est une variable définie en dehors de toute fonction (au niveau du module). Elle est accessible depuis n'importe quel endroit de votre code, y compris à l'intérieur des fonctions.
Il est important de comprendre la différence entre les variables locales et globales pour éviter les erreurs et les comportements inattendus. Si vous essayez d'accéder à une variable locale en dehors de la fonction où elle est définie, vous obtiendrez une erreur `NameError`.
Nous verrons des exemples de variables locales et globales, et comment Python détermine la portée d'une variable.
Les mots-clés `global` et `nonlocal` : modifiez la portée
Normalement, si vous affectez une valeur à une variable à l'intérieur d'une fonction, Python crée une nouvelle variable locale, même si une variable globale du même nom existe déjà. Si vous voulez modifier la valeur d'une variable globale à l'intérieur d'une fonction, vous devez utiliser le mot-clé `global`.
En utilisant `global nom_de_la_variable` au début du corps de la fonction, vous indiquez à Python que vous voulez utiliser la variable globale, et non créer une nouvelle variable locale. Toute modification apportée à cette variable à l'intérieur de la fonction affectera la variable globale.
Le mot-clé `nonlocal` est similaire à `global`, mais il est utilisé dans les fonctions imbriquées (fonctions définies à l'intérieur d'autres fonctions). Il vous permet de modifier la valeur d'une variable définie dans la portée englobante (la fonction parente), mais pas la portée globale.
En utilisant `nonlocal nom_de_la_variable`, vous indiquez à Python que vous voulez utiliser la variable définie dans la fonction parente, et non créer une nouvelle variable locale. Toute modification apportée à cette variable à l'intérieur de la fonction imbriquée affectera la variable de la fonction parente.
Nous verrons comment utiliser `global` et `nonlocal`, et quand les utiliser. Une utilisation excessive de `global` peut rendre votre code plus difficile à comprendre et à maintenir, il est donc important de l'utiliser avec parcimonie.
La règle LEGB : Local, Enclosing, Global, Built-in
Lorsque vous utilisez une variable dans votre code, Python recherche cette variable dans différents espaces de noms, en suivant un ordre précis : c'est la règle LEGB (Local, Enclosing, Global, Built-in).
D'abord, Python recherche la variable dans l'espace de noms local (L), c'est-à-dire à l'intérieur de la fonction courante. S'il la trouve, il l'utilise. Sinon, il passe à l'étape suivante.
Ensuite, Python recherche la variable dans les espaces de noms englobants (E), c'est-à-dire dans les fonctions parentes, si la fonction courante est une fonction imbriquée. S'il la trouve, il l'utilise. Sinon, il passe à l'étape suivante.
Puis, Python recherche la variable dans l'espace de noms global (G), c'est-à-dire au niveau du module. S'il la trouve, il l'utilise. Sinon, il passe à l'étape suivante.
Enfin, Python recherche la variable dans l'espace de noms intégré (B), qui contient les fonctions et les constantes prédéfinies de Python (comme `print`, `len`, `True`, `False`). S'il la trouve, il l'utilise. Sinon, il lève une erreur `NameError`.
Comprendre la règle LEGB est essentiel pour comprendre comment Python résout les noms de variables, et pour éviter les erreurs liées à la portée.
Espaces de noms : des dictionnaires pour organiser les variables
Un espace de noms est un système qui permet d'associer des noms (de variables, de fonctions, de classes, etc.) à des objets. En Python, les espaces de noms sont implémentés sous forme de dictionnaires, où les clés sont les noms et les valeurs sont les objets.
Chaque module a son propre espace de noms global. Chaque fonction a son propre espace de noms local. Et il existe un espace de noms intégré qui contient les noms prédéfinis de Python.
Vous pouvez accéder à l'espace de noms global d'un module en utilisant la fonction `globals()`, et à l'espace de noms local d'une fonction en utilisant la fonction `locals()`. Ces fonctions renvoient des dictionnaires que vous pouvez explorer.
Comprendre les espaces de noms peut vous aider à comprendre comment Python gère les variables, et à déboguer les problèmes liés à la portée.