Notion de variable locale

Il est tout à fait possible de déclarer une variable dans le corps d'une fonction, mais, attention, le résultat pourrait vous surprendre :

À faire vous-même 11.1

Quel est le résultat attendu après l'exécution du programme ci-dessous ?


def mafon():
	entier=10
print(entier)
			

Testez votre réponse en exécutant ce programme.


Cela ne fonctionne pas ! Le système nous renvoie une erreur : «NameError: name 'entier' is not defined», étrange, non ? 'entier' est bien défini dans la fonction mafon ?

En fait non, cela est tout à fait normal.

Dans la plupart des langages, une variable définie dans une fonction est utilisable uniquement dans cette fonction. En dehors de cette fonction, la variable n'existe pas !

Une variable définie dans une fonction est appelée variable locale.

À faire vous-même 11.2

Quel est le résultat attendu après l'exécution du programme ci-dessous ?


entier=10
def mafon():
	entier=entier+1
mafon()
print(entier)
			

Testez votre réponse en exécutant ce programme.


Comme vous pouvez le constater, le programme ci-dessus ne fonctionne pas.

La variable "entier" définie en dehors de la fonction ("entier=10") et la variable entier utilisée dans la fonction ("entier=entier+1") sont deux variables différentes (même si elle porte le même nom).

La variable "entier" présente dans la fonction est utilisée ("entier=entier+1"), sans jamais avoir été définie, d'où le message d'erreur.

Pour utiliser dans une fonction une variable qui a été définie à l'extérieur de cette même fonction, il faut utiliser l'instruction "global"

À faire vous-même 11.3

Tester le programme suivant :


entier=10
def mafon():
	global entier
	entier=entier+1
mafon()
print(entier)
			

Dans le programme ci-dessus le "global entier" signifie "il faut utiliser la variable "entier" qui a été définie en dehors de la fonction".

ATTENTION : Il est préférable, autant que possible, d'éviter l'utilisation de "global" (mauvaise pratique de programmation). Quand c'est possible (et ce n'est pas toujours le cas), on préférera utiliser une structure de la forme (passage de paramètre à une fonction) :


entier=10
def mafon(para):
	val=para+1
	return val
print(mafon(entier))
			

Attention, la variable "entier" n'a pas été modifiée, si vous voulez que la fonction mafon modifie la variable, l'utilisation de "global" est indispensable.