En Python, qu'est-ce qu'une déclaration globale?
qu'est Ce qu'un "151910920 global" instruction ? Et comment est-il utilisé? J'ai lu définition officielle de Python ;
cependant, il ne fait pas beaucoup de sens pour moi.
5 réponses
chaque "variable" en python est limitée à une certaine portée. La portée d'un "fichier" python est le module-portée. Considérons ce qui suit:
#file test.py
myvariable = 5 # myvariable has module-level scope
def func():
x = 3 # x has "local" or function level scope.
objets avec portée locale meurent dès que la fonction sort et ne peut jamais être récupéré( à moins que vous return
eux), mais dans une fonction, vous pouvez accéder à des variables dans le module niveau portée (ou tout contenant portée):
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 la tâche sur ce de référence et d'attendre qu'il se propage à l'extérieur de la portée:
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 finalement à global
. Le mot-clé global
est la façon dont vous dites à python qu'une variable particulière dans votre fonction est définie au niveau global (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 changer la valeur de myvariable
dans le module-scope de l'intérieur de func
si vous utilisez le mot-clé global
.
de part, les portées peuvent être emboîtées arbitrairement en profondeur:
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()
maintenant dans ce cas, aucune des variables n'est déclarée à la portée globale, et en python2, il n'y a pas de moyen (facile/propre) de changer la valeur de x
dans la portée de func1
de l'intérieur de func3
. C'est pourquoi le mot-clé nonlocal
a été introduit en python3.x . nonlocal
est une extension de global
qui vous permet de modifiez une variable que vous avez récupérée d'un autre scope, quel que soit le scope d'où elle a été retirée.
mgilson a fait du bon travail, mais j'aimerais en ajouter d'autres.
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]
à l'intérieur d'une fonction, Python considère chaque variable comme une variable locale sauf si vous déclarez comme global, ou si vous accédez à une variable globale.
list1.append(2)
était possible parce que vous accédez à la 'list1' 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 elle était déjà référencée avant, et vous êtes hors de portée pour la réassigner.
pour entrer dans le champ d'application, déclarez "list1" comme global.
je vous recommande fortement de lire ce même s'il y a une faute de frappe à la fin.
indique à L'interpréteur que la variable qu'il donne 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 déclarant comme globale dans chaque fonction qui modifie
Python veut s'assurer que vous savez vraiment avec quoi vous jouez en exigeant explicitement le mot clé global.
voir cette réponse