En Python, ¿qué es una declaración global?
title in python plot (5)
Básicamente, le dice al intérprete que la variable que se le da debe modificarse o asignarse a nivel global, en lugar del nivel local predeterminado.
¿Qué es una declaración global ? ¿Y cómo se usa? He leído la definición oficial de Python ;
Sin embargo, no tiene mucho sentido para mí.
Cada "variable" en python está limitada a un cierto alcance. El alcance de un "archivo" de python es el módulo-alcance. Considera lo siguiente:
#file test.py
myvariable = 5 # myvariable has module-level scope
def func():
x = 3 # x has "local" or function level scope.
Los objetos con alcance local mueren tan pronto como la función sale y nunca se pueden recuperar (a menos que los return
), pero dentro de una función, puede acceder a variables en el alcance a nivel de módulo (o cualquier alcance que contenga):
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()
Sin embargo, no puede usar la asignación en esa referencia y esperar que se propague a un ámbito externo:
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
Ahora, finalmente estamos a global
. La palabra clave global
es la forma en que le dice a Python que una variable en particular en su función está definida en el ámbito global (nivel de módulo).
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 otras palabras, puede cambiar el valor de myvariable
en el módulo-alcance desde la func
si usa la palabra clave global
.
Como un lado, los ámbitos pueden ser anidados arbitrariamente profundos:
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()
Ahora, en este caso, ninguna de las variables se declara en el ámbito global, y en python2, no hay una forma (fácil / limpia) de cambiar el valor de x
en el ámbito de func1
desde func3
. Es por eso que la palabra clave nonlocal
se introdujo en python3.x. nonlocal
es una extensión de global
que le permite modificar una variable que haya seleccionado de otro ámbito en cualquier ámbito del que se extrajo.
Puede usar una variable global en otras funciones declarándola como global en cada función que la modifique
Python quiere asegurarse de que realmente sabes con qué estás jugando al requerir explícitamente la palabra clave global.
Ver esta respuesta
mgilson hizo un buen trabajo, pero me gustaría agregar algo más.
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]
Dentro de una función, Python asume cada variable como una variable local, a menos que la declare como global, o esté accediendo a una variable global.
list1.append(2)
fue posible porque está accediendo a la ''lista1'' y las listas son mutables.
list2 = [222]
fue posible porque estás inicializando una variable local.
Sin embargo, si elimina el comentario # list1 = [9], obtendrá
UnboundLocalError: local variable ''list1'' referenced before assignment
Significa que está intentando inicializar una nueva variable local ''list1'' pero ya se hizo referencia anteriormente y está fuera del alcance para reasignarla.
Para ingresar al alcance, declare ''list1'' como global.
Te recomiendo que leas this aunque haya un error al final.
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