Qu'est-ce qu'un énoncé global? Et comment est-il utilisé? J'ai lu la définition officielle de Python ;
Cependant, cela n’a pas beaucoup de sens pour moi.
Chaque "variable" en python est limitée à une certaine portée. La portée d'un "fichier" python est la portée du module. Considérer ce qui suit:
#file test.py
myvariable = 5 # myvariable has module-level scope
def func():
x = 3 # x has "local" or function level scope.
Les objets ayant une portée locale meurent dès que la fonction est fermée et ne peuvent jamais être récupérés (sauf si vous les return
), mais dans une fonction, vous pouvez accéder aux variables de la portée du niveau module (ou de toute portée contenant):
myvariable = 5
def func():
print(myvariable) # prints 5
def func2():
x = 3
def func3():
print(x) # will print 3 because it picks it up from `func2`'s scope
func3()
Cependant, vous ne pouvez pas utiliser d'affectation sur cette référence et vous attendre à ce qu'elle soit propagée à une étendue externe:
myvariable = 5
def func():
myvariable = 6 # creates a new "local" variable.
# Doesn't affect the global version
print(myvariable) # prints 6
func()
print(myvariable) # prints 5
Maintenant, nous sommes enfin à global
. Le mot clé global
représente la manière dont vous indiquez à python qu'une variable particulière de votre fonction est définie au niveau global (au niveau du module).
myvariable = 5
def func():
global myvariable
myvariable = 6 # changes `myvariable` at the global scope
print(myvariable) # prints 6
func()
print(myvariable) # prints 6 now because we were able
# to modify the reference in the function
En d'autres termes, vous pouvez modifier la valeur de myvariable
dans le module-scope à partir de func
si vous utilisez le mot clé global
.
En passant, les portées peuvent être imbriquées de manière arbitraire:
def func1():
x = 3
def func2():
print("x=",x,"func2")
y = 4
def func3():
nonlocal x # try it with nonlocal commented out as well. See the difference.
print("x=",x,"func3")
print("y=",y,"func3")
z = 5
print("z=",z,"func3")
x = 10
func3()
func2()
print("x=",x,"func1")
func1()
Désormais, dans ce cas, aucune des variables n'est déclarée dans la portée globale et, dans python2, il n'y a pas de moyen (simple/propre) de modifier la valeur de x
dans la portée de func1
à partir de func3
. C'est pourquoi le mot clé nonlocal
a été introduit dans python3.x. nonlocal
est une extension de global
qui vous permet de modifier une variable que vous avez extraite d'une autre étendue, quelle que soit l'étendue à partir de laquelle elle a été extraite.
mgilson a fait du bon travail, mais j'aimerais en ajouter un peu plus.
list1 = [1]
list2 = [1]
def main():
list1.append(3)
#list1 = [9]
list2 = [222]
print list1, list2
print "before main():", list1, list2
>>> [1] [1]
main()
>>> [1,3] [222]
print list1, list2
>>> [1, 3] [1]
Dans une fonction, Python considère chaque variable comme une variable locale Sauf si vous la déclarez globale ou si vous accédez à une variable globale.
list1.append(2)
était possible parce que vous accédez à la 'liste1' et que les listes sont mutables.
list2 = [222]
était possible parce que vous initialisez une variable locale.
Cependant, si vous décommentez # list1 = [9], vous obtiendrez
UnboundLocalError: local variable 'list1' referenced before assignment
Cela signifie que vous essayez d'initialiser une nouvelle variable locale 'list1', mais qu'elle a déjà été référencée auparavant,
Pour entrer dans la portée, déclarez 'list1' en tant que global.
Je vous recommande fortement de lire ceci même s’il ya une faute de frappe à la fin.
Fondamentalement, il indique à l'interprète que la variable qui lui est attribuée doit être modifiée ou assignée au niveau global plutôt qu'au niveau local par défaut.
a = 1
def f():
a = 2 # doesn't affect global a, this new definition hides it in local scope
a = 1
def f():
global a
a = 2 # affects global a
Vous pouvez utiliser une variable globale dans d'autres fonctions en la déclarant globale dans chaque fonction qui la modifie.
Python veut s'assurer que vous savez vraiment ce que vous jouez en demandant explicitement le mot clé global.
Voir cette réponse