Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Fonctions et variables globales

Accès rapide :
Introduction à la problématique
Utilisation d'une variable globale

Introduction à la problématique

Par défaut, si une fonction Python utilise une variable dans le corps de la fonction, il partira du principe que celle-ci est locale à la fonction. En conséquence, les lignes de code suivantes ne fonctionnent pas.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
#!/usr/bin/python3
            
globalVariable = 1
 
def aFunction():
    globalVariable += 1  # Produit une erreur 
 
if __name__ == '__main__':
    aFunction()
    print("main: %d" % globalVariable)
Par défaut, une fonction manipule des variables locales

Et voici le message d'erreur produit lors de l'exécution du programme.

Traceback (most recent call last):
  File "TestGlobal.py", line 7, in <module>
    aFunction()
  File "TestGlobal.py", line 4, in aFunction
    globalVariable += 1  # Produit une erreur 
UnboundLocalError: local variable 'globalVariable' referenced before assignment

L'exemple précédent a le mérite d'être explicite, grâce à la production du message d'erreur. Mais parfois, le programme peut s'exécuter sans produire d'erreur mais en produisant des résultats non prévus. Analysez le code suivant.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
#!/usr/bin/python3
            
globalVariable = 100
 
def aFunction():
    globalVariable = 0
    for i in range(10):
        globalVariable += 1
    print("aFunction: %d" % globalVariable)
 
 
if __name__ == '__main__':
    print("main begin: %d" % globalVariable)
    aFunction()
    print("main end: %d" % globalVariable)
Par défaut, une fonction manipule des variables locales

Le programme ne produira pas d'erreur à cause de la ligne 6 : si globalVariable n'existait pas et bien maintenant elle existe. La question est de savoir ce qu'affichent ces quelques lignes de codes. Je suis presque certain que vous auriez dis que la dernière ligne affiche 10. Or si globalVariable n'est pas une variable globale à la fonction, la première variable ne devrait pas changer d'état. Voici les résultats produit par cet exemple.

main begin: 100
aFunction: 10
main end: 100

Utilisation d'une variable globale

Pour que l'exemple précédent utilise bien la variable globale dans le corps de la fonction, il est nécessaire d'indiquer, dans cette fonction, la portée de la variable. Cela se fait via le mot clé global. Voici le code modifié pour utiliser la variable globale : portez votre attention sur la ligne 6.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
#!/usr/bin/python3

globalVariable = 100
 
def aFunction():
    global globalVariable
    globalVariable = 0
    for i in range(10):
        globalVariable += 1
    print("aFunction: %d" % globalVariable)
 
 
if __name__ == '__main__':
    print("main begin: %d" % globalVariable)
    aFunction()
    print("main end: %d" % globalVariable)
Utilisation d'une variable globale

Et voici les résultats produits par l'exemple ci-dessus.

main begin: 100
aFunction: 10
main end: 10