Python: Portée des variables

From Wiki Cours
Jump to navigation Jump to search

<--Sommaire

Portée des variables

Le bloc principal s'appelle le bloc global, les variables qui y sont définies sont appelées 'variables globales' et visibles par la fonction globals(). Dans les bloc secondaires, les variables déclarées sont locales et visibles en utilisant locals().

À l'intérieur des fonctions ou des classes, les variables sont définies localement à l'intérieur du bloc. Elles sont créées et détruites à l'appel de la fonction et ne sont pas visibles à l'extérieur. Par exemple:

def f():
    a = 10
    print(locals())
f()
print(a)

renvoie une erreur car 'a' n'est pas définie dans le bloc où il y a 'print'. Par contre, la structure

a = 10
def f():
    print(a)
f()

fonctionne car 'a' est définie dans le bloc supérieur et f() peut y accéder. Dans ce cas, on dit que 'a' est une variable globale. C'est le cas des variables définies à l'extérieur des fonctions. Les fonctions peuvent accéder à leur contenu mais, sauf mention du contraire (voir ci-après), elles ne peuvent les modifier.

On peut avoir des variables globales et locales avec le même nom. Dans ce cas, c'est la variable locale qui est utilisée en priorité si elle existe.

a = 10 # variable globale
def f():
    a = 20 # variable locale
    print(a)
f()
print(a)

La variable globale demeure inchangée.

Cependant, il peut y avoir un conflit si l'on souhaite définir localement une variable s'appelant également 'a'. Ainsi,

a = 10
def f():
    print(a)  # voit qu'une variable locale existe ainsi qu'une globale et veut utiliser la locale
    a = 20    # à cause des règles de priorité
f()

renvoie une erreur car au moment du 'print' car Python cherche à utiliser la variable locale (il voit qu'elle a été définie dans le corps de la fonction) mais elle n'a pas encore été affectée. Ce code est erroné sémantiquement.

Pour que la fonction puisse modifier la variable globale 'a' il faut utiliser le mot-clé global qui signale que la variable 'a' à utiliser dans la fonction est la variable globale et non une variable locale à créer. Ainsi,

a = 10
def f():
    global a
    a = 20
    print(a)
f()
print(a)

a bien modifié la valeur de la variable globale 'a'.

Il est préférable dans tous les cas de minimiser le nombre de variables globales et par conséquent l'utilisation du mot-clé global. Cependant, cela peut résoudre simplement des problèmes. Il faut les éviter pour des bibliothèques et des modules.