Accès rapide :
Introduction à la problématique
Utilisation d'une variable globale
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) |
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) |
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
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) |
Et voici les résultats produits par l'exemple ci-dessus.
main begin: 100 aFunction: 10 main end: 10
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 :