Si creo una variable global en una función, ¿cómo puedo usar esa variable en otra función?
Podemos crear un global con la siguiente función:
def create_global_variable():
global global_variable # must declare it to be a global first
# modifications are thus reflected on the module's global scope
global_variable = 'Foo'
Escribir una función en realidad no ejecuta su código. Entonces llamamos a la create_global_variable
función:
>>> create_global_variable()
Usando globals sin modificación
Simplemente puede usarlo, siempre y cuando no espere cambiar a qué objeto apunta:
Por ejemplo,
def use_global_variable():
return global_variable + '!!!'
y ahora podemos usar la variable global:
>>> use_global_variable()
'Foo!!!'
Modificación de la variable global desde una función.
Para apuntar la variable global a un objeto diferente, debe usar la palabra clave global nuevamente:
def change_global_variable():
global global_variable
global_variable = 'Bar'
Tenga en cuenta que después de escribir esta función, el código que realmente la cambia aún no se ha ejecutado:
>>> use_global_variable()
'Foo!!!'
Entonces, después de llamar a la función:
>>> change_global_variable()
Podemos ver que la variable global ha cambiado. El global_variable
nombre ahora apunta a 'Bar'
:
>>> use_global_variable()
'Bar!!!'
Tenga en cuenta que "global" en Python no es verdaderamente global, solo es global al nivel del módulo. Por lo tanto, solo está disponible para funciones escritas en los módulos en los que es global. Las funciones recuerdan el módulo en el que están escritas, por lo que cuando se exportan a otros módulos, aún buscan en el módulo en el que fueron creadas para encontrar variables globales.
Variables locales con el mismo nombre.
Si crea una variable local con el mismo nombre, eclipsará una variable global:
def use_local_with_same_name_as_global():
# bad name for a local variable, though.
global_variable = 'Baz'
return global_variable + '!!!'
>>> use_local_with_same_name_as_global()
'Baz!!!'
Pero usar esa variable local mal nombrada no cambia la variable global:
>>> use_global_variable()
'Bar!!!'
Tenga en cuenta que debe evitar usar las variables locales con los mismos nombres que los globales, a menos que sepa exactamente lo que está haciendo y tenga una muy buena razón para hacerlo. Todavía no he encontrado tal razón.
Tenemos el mismo comportamiento en las clases.
Un seguimiento en el comentario pregunta:
¿Qué hacer si quiero crear una variable global dentro de una función dentro de una clase y quiero usar esa variable dentro de otra función dentro de otra clase?
Aquí demuestro que obtenemos el mismo comportamiento en los métodos que en las funciones regulares:
class Foo:
def foo(self):
global global_variable
global_variable = 'Foo'
class Bar:
def bar(self):
return global_variable + '!!!'
Foo().foo()
Y ahora:
>>> Bar().bar()
'Foo!!!'
Pero sugeriría que, en lugar de usar variables globales, use atributos de clase, para evitar saturar el espacio de nombres del módulo. También tenga en cuenta que no usamos self
argumentos aquí; estos podrían ser métodos de clase (útiles si muta el atributo de clase del cls
argumento habitual ) o métodos estáticos (no self
o cls
).