Formation I.S.N.

Variable globale ou locale ?

Un premier exemple

Voici deux scripts qui, à première vue, sont équivalents. Pourtant…

Script n°1Script n°2

						x = 3
						print(x)
						x= 5
						print(x)
						x = 0
						print(x)
						x = 7
						print(x)
						x = 0
						print(x)
						x = 4
						print(x)
						

Ce qui donne :

					3
					5
					0
					7
					0
					4

						def reinitialise ():
							x = 0

						x = 3
						print(x)
						x= 5
						print(x)
						reinitialise()
						print(x)
						x = 7
						print(x)
						reinitialise()
						print(x)
						x = 4
						print(x)
						

Ce qui donne :

					3
					5
					5
					7
					7
					4


Étant donnée le corps de la fonction reinitialise dans le script n°2, on pourrait penser que son appel aurait le même effet que la saisie directe de l’instruction x = 0.

Cette différence est due aux notions de variable locale et de variable globale.



Lorsqu’on exécute l’instruction de la fonction reinitialise dans l’état « x = 5 » , on commence par créer un nouvel état qui contient une boîte nommée aussi x à laquelle est associée la valeur 0 car la fonction reinitialise a une variable locale x qui porte par hasard le même nom que la variable utilisée dans le programme principal.

Si l’on décrit l’état d’exécution de chacun de ces deux scripts, on obtient alors le résultat suivant :

Script n°1Script n°2
Etat d'exécution 1 Etat d'exécution 2


Les variables utilisées dans une fonction sont classées en locales et globales. Sont locales les arguments formels de la fonction et les variables affectées dans la fonction qui ne sont pas explicitement déclarées globales. Sont globales les autres variables, c’est-à-dire celles qui ne sont pas un argument formel et qui sont utilisées sans être affectées ou explicitement déclarées globales.

Ainsi, pour que le script n°2 donne le même résultat que le script n°1, il faudrait écrire ceci :


				
				

Un deuxième exemple

Voici deux nouveaux script :

Script n°1Script n°2

						a = 4
						b = 7
						print(a,end="")
						print(";",end="")
						print(b)

						c = a
						a = b
						b = c
						print(a,end="")
						print(";",end="")
						print(b)
						

Ce qui donne :

					4;7
					7;4

						def echange (x,y):
							z = x
							x = y
							y = z

						a = 4
						b = 7
						print(a,end="")
						print(";",end="")
						print(b)
						echange(a,b)
						print(a,end="")
						print(";",end="")
						print(b)
						

Ce qui donne :

					4;7
					4;7


Examinons les états d’exécution successifs du script n°2 :

EtatIllustration
n°1Etat n°1
n°2Etat n°2
n°3Etat n°3
n°4Etat n°4


Les états n°2 et n°3 n’existent que le temps de l’exécution de la fonction echange. Le programme principal allant communiquer avec la fonction echange, il permet de remplir les boîtes x et y de l’état n°2 pour que la fonction puisse s’exécuter mais les boîtes a et b ne sont en rien affectées par ce processus.