dentro de un ámbito de Python, cualquier asignación a una variable no se ha declarado dentro de ese ámbito crea una nueva variable local menos esa variable se declaró anteriormente en la función como una referencia a una variable de ámbito global con la palabra clave global
. mirada
Vamos a una versión modificada de su pseudocódigo para ver lo que sucede:
# 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
De hecho, se podría reescribir todos func_B
con la variable llamada x_local
y que funcionaría de forma idéntica.
El orden solo importa en cuanto al orden en que sus funciones realizan operaciones que cambian el valor de la x global. Por lo tanto, en nuestro ejemplo, el orden no importa, ya que func_B
llama al func_A
. En este ejemplo, el orden importa:
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'.
Tenga en cuenta que global
solamente se requiere para modificar los objetos globales. Aún puede acceder a ellos desde dentro de una función sin declarar global
. Por lo tanto, tenemos:
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 diferencia entre create_locally
y access_only
-access_only
está accediendo a los x globales a pesar de no llamar global
, y aunque create_locally
no utiliza global
bien, se crea una copia local desde es asignando un valor.
La confusión aquí es por qué no debe usar variables globales.
tenga cuidado también de no asumir solo porque tiene una variable asignada en su función que python tratará las referencias antes de la asignación como tal. Hasta la primera asignación, si usó x, no sería la global, ni la local. Obtendrá la infame excepción UnboundLocalError en su cara :) – osirisgothra