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.

19
demandé sur Honest Abe 2012-12-14 19:16:08

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.

40
répondu mgilson 2017-01-28 05:58:04

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.

1
répondu YOUNG 2015-04-26 12:16:15

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.

0
répondu Jakob Bowyer 2012-12-14 15:19:03
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
0
répondu StoryTeller 2012-12-14 15:20:55

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

0
répondu vivek 2017-05-23 12:02:43