All'interno di un ambito Python, qualsiasi assegnazione a una variabile non già dichiarata all'interno di tale ambito crea una nuova variabile locale a meno che tale variabile non sia stata dichiarata in precedenza nella funzione come riferita a una variabile con ambito globale con la parola chiave global
.
Diamo un'occhiata a una versione modificata del tuo pseudocodice per vedere cosa succede:
# 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
In effetti, è possibile riscrivere tutto func_B
con la variabile denominatax_local
e funzionerebbe in modo identico.
L'ordine conta solo fino all'ordine in cui le tue funzioni eseguono operazioni che cambiano il valore della x globale. Pertanto, nel nostro esempio, l'ordine non ha importanza, poiché le func_B
chiamate func_A
. In questo esempio, l'ordine conta:
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'.
Si noti che global
è richiesto solo per modificare oggetti globali. È comunque possibile accedervi dall'interno di una funzione senza dichiarare global
. Pertanto, abbiamo:
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.
Nota la differenza tra create_locally
e access_only
- access_only
sta accedendo alla x globale nonostante non chiami global
, e anche se create_locally
non usa global
neanche, crea una copia locale poiché sta assegnando un valore.
La confusione qui è perché non dovresti usare le variabili globali.