Voici une fonction pas très utile :
def retourne_un():
x = 1
return x
retourne_un()
On dit que x est une variable locale. Elle est définie à l'intérieur de la fonction.
Ci-dessous, la variable x qui contient 7 est une variable globale :
x = 7
def retourne_un():
x = 1
return x
print(retourne_un())
print(x)
Lors de l'exécution de la fonction retourne_un, x est d'abord cherchée localement à l'intérieur de la fonction : 1
Lors du print(x), x est cherché dans le module courant : 7
Avantage : on peut utiliser des variables locales à l'intérieur des fonctions sans se soucier de leur nom : si une variable globale à l'extérieur de la fonction porte le même nom, la variable globale ne sera pas modifiée.
On peut utiliser une variable globale dans une fonction :
x = 7
def multiplie(n):
return n*x
multiplie(10)
Plus fort mais déconseillé : on peut modifier une variable globale dans une fonction :
x = 7
def bof(n):
global x
x = x+1
return n*x
print(bof(10))
print(x)
C'est déconseillé car : dans un programme très long, où la fonction est écrite très loin de l'affectation de la variable, il est très difficile de s'y retrouver.
Quelles sont les variables locales et globales ci-dessous ? Qu'affiche le programme ? Réfléchir puis exécuter le programme ci-dessous.
a = 1
b = 2
def f():
b = 30
c = 4
return a + b + c
print(f())
print(a)
print(b)
Que se passe-t-il si on ajoute à la fin print(c) ?
a = 1
b = 2
def f():
b = 30
c = 4
return a + b + c
print(f())
print(a)
print(b)
print(c)
La variable c est définie localement dans la fonction mais pas dans le bloc où est le print(c).
Quelles sont les variables locales et globales ci-dessous ? Qu'affiche le programme ? Réfléchir puis exécuter le programme ci-dessous.
def fonction1(k):
global x
x = 2*x
a = 2*x
b = k + a
return b
x = 5
a = 3
b = 1
print(x)
print(a)
print(b)
print(fonction1(10))
print(x)
print(a)
print(b)
Quelles sont les variables locales et globales ci-dessous ? Qu'affiche le programme ? Réfléchir puis exécuter le programme ci-dessous.
def f(x):
x = 5
return x
x = 10
print(f(x))
print(x)
Tout semble normal...
Quelles sont les variables locales et globales ci-dessous ? Qu'affiche le programme ? Réfléchir puis exécuter le programme ci-dessous.
def tri_liste(L):
if L[0] > L[1]:
aux = L[0]
L[0] = L[1]
L[1] = aux
return L
L1 = [6,2]
print(tri_liste(L1))
print(L1)
Explication :
Pour bien comprendre ce qui s'est passé aux exercices 3 et 4, copier le code de l'exercice 3, le coller dans pythontutor.com, visualiser pas à pas l'exécution.
Faire de même avec le code de l'exercice 4.
x = 1
y = 2
z = 3
def f():
x = 10
y = 20
def g():
x = 100
return x+y+z
return g()
print(f())
print(x+y+z)
Lors de l'appel à la fonction g, les variables sont cherchées dans l'ordre LEG : Localement, puis dans la fonction Englobante, puis Globalement.
Dans g, pour calculé x+y+z,
a = 2
b = a
Les variables a et b pointent sur le même objet, l'entier 2.
a = 3
print(a,b)
a pointe maintenant sur l'objet 3 et b pointe toujours sur l'objet 2
Quelques problèmes se posent quand l'objet est mutable.
LA = [5, 8, 4]
LB = LA
Les variables LA et LB pointent vers le même objet liste [,,], une liste à trois places. La première place pointe sur l'objet 5, la deuxième sur 8, la troisième sur 4.
Si on modifie un des éléments :
LA[1] = 10
print(LA)
print(LB)
La deuxième place de la liste pointe maintenant sur 10.
Si on souhaite que LB ne soit pas modifiée, il faut faire une "shallow copy de la liste" : dans la mémoie, il n'y aura plus un seul objet liste mais deux.
LA = [5, 8, 4]
LB = LA[:]
LA[1] = 10
print(LA)
print(LB)