Au sein d'un Python de la portée, toute affectation à une variable n'est déjà déclarées au sein de ce champ crée une nouvelle variable locale à moins que la variable est déclarée plus tôt dans la fonction comme se référant à une étendue globale variable avec le mot-clé global
.
Regardons une version modifiée de votre pseudo-code pour voir ce qui se passe:
# Here, we're creating a variable 'x', in the __main__ scope.
x = 'None!'
def func_A():
# The below declaration lets the function know that we
# mean the global 'x' when we refer to that variable, not
# any local one
global x
x = 'A'
return x
def func_B():
# Here, we are somewhat mislead. We're actually involving two different
# variables named 'x'. One is local to func_B, the other is global.
# By calling func_A(), we do two things: we're reassigning the value
# of the GLOBAL x as part of func_A, and then taking that same value
# since it's returned by func_A, and assigning it to a LOCAL variable
# named 'x'.
x = func_A() # look at this as: x_local = func_A()
# Here, we're assigning the value of 'B' to the LOCAL x.
x = 'B' # look at this as: x_local = 'B'
return x # look at this as: return x_local
En fait, on pourrait réécrire tout func_B
à la variable nommée x_local
et cela fonctionne de la même manière.
L'importance de l'ordre dans la seule mesure où l'ordre dans lequel vos fonctions ne opérations qui modifient la valeur de la global x. Ainsi, dans notre exemple, l'ordre n'a pas d'importance, puisqu' func_B
des appels func_A
. Dans cet exemple, l'ordre a de l'importance:
def a():
global foo
foo = 'A'
def b():
global foo
foo = 'B'
b()
a()
print foo
# prints 'A' because a() was the last function to modify 'foo'.
Notez que global
n'est nécessaire pour modifier des objets globaux. Vous pouvez toujours y accéder à partir de l'intérieur d'une fonction, sans le déclarer global
.
Ainsi, nous avons:
x = 5
def access_only():
return x
# This returns whatever the global value of 'x' is
def modify():
global x
x = 'modified'
return x
# This function makes the global 'x' equal to 'modified', and then returns that value
def create_locally():
x = 'local!'
return x
# This function creates a new local variable named 'x', and sets it as 'local',
# and returns that. The global 'x' is untouched.
Notez la différence entre create_locally
et access_only
-- access_only
accède au mondial de x en dépit de ne pas appeler global
, et même si create_locally
ne pas utiliser global
soit, il crée une copie locale puisque c'est l'attribution d'une valeur.
La confusion ici, c'est pourquoi vous ne devriez pas utiliser des variables globales.