web-dev-qa-db-fra.com

En Python, qu'est-ce qu'une déclaration globale?

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.

26
Capurnicus

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.

51
mgilson

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.

1
YOUNG

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.

0
Jakob Bowyer
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
StoryTeller

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

0
vivek