¿Cómo utilizar una variable global en una función?
¿Cómo creo o uso una variable global dentro de una función?
¿Cómo uso una variable global que se definió en una función dentro de otras funciones?
No utilizar la global
palabra clave cuando corresponde a menudo causa UnboundLocalError
. Las reglas precisas para esto se explican en UnboundLocalError en la variable local cuando se reasigna después del primer uso . En general, cierre otras preguntas como un duplicado de esa pregunta cuando se busca una explicación y esta pregunta cuando alguien simplemente necesite conocer la global
palabra clave.
Puede utilizar una variable global dentro de otras funciones declarándola global
dentro de cada función que le asigna un valor :
globvar = 0
def set_globvar_to_one():
global globvar # Needed to modify global copy of globvar
globvar = 1
def print_globvar():
print(globvar) # No need for global declaration to read value of globvar
set_globvar_to_one()
print_globvar() # Prints 1
Dado que no está claro si globvar = 1
se está creando una variable local o cambiando una variable global, Python crea de forma predeterminada una variable local y le hace elegir explícitamente el otro comportamiento con la global
palabra clave.
Vea otras respuestas si desea compartir una variable global entre módulos.
Si entiendo correctamente su situación, lo que está viendo es el resultado de cómo Python maneja los espacios de nombres locales (función) y globales (módulo).
Digamos que tienes un módulo como este:
# sample.py
_my_global = 5
def func1():
_my_global = 42
def func2():
print _my_global
func1()
func2()
Es posible que espere que esto imprima 42, pero en su lugar imprime 5. Como ya se mencionó, si agrega una global
declaración '' a func1()
, func2()
imprimirá 42.
def func1():
global _my_global
_my_global = 42
Lo que sucede aquí es que Python asume que cualquier nombre asignado a , en cualquier lugar dentro de una función, es local para esa función a menos que se indique explícitamente lo contrario. Si solo está leyendo un nombre y el nombre no existe localmente, intentará buscar el nombre en cualquier ámbito que lo contenga (por ejemplo, el ámbito global del módulo).
Por lo tanto, cuando asigna 42 al nombre _my_global
, Python crea una variable local que oculta la variable global del mismo nombre. Ese local sale del alcance y se recolecta como basura cuando func1()
regresa; mientras tanto, func2()
nunca puede ver nada más que el nombre global (sin modificar). Tenga en cuenta que esta decisión sobre el espacio de nombres ocurre en tiempo de compilación, no en tiempo de ejecución; si leyera el valor de _my_global
inside func1()
antes de asignarlo, obtendría un UnboundLocalError
, porque Python ya ha decidido que debe ser una variable local, pero todavía no ha tenido ningún valor asociado. Pero al usar la global
instrucción '', le dices a Python que debería buscar el nombre en otra parte en lugar de asignarlo localmente.
(Creo que este comportamiento se originó en gran medida a través de la optimización de los espacios de nombres locales; sin este comportamiento, la máquina virtual de Python necesitaría realizar al menos tres búsquedas de nombres cada vez que se asigna un nuevo nombre dentro de una función (para garantizar que el nombre no ya existen a nivel de módulo/integrado), lo que ralentizaría significativamente una operación muy común).
Quizás quieras explorar la noción de espacios de nombres . En Python, el módulo es el lugar natural para los datos globales :
Cada módulo tiene su propia tabla de símbolos privada, que todas las funciones definidas en el módulo utilizan como tabla de símbolos global. Por lo tanto, el autor de un módulo puede utilizar variables globales en el módulo sin preocuparse por conflictos accidentales con las variables globales del usuario. Por otro lado, si sabes lo que estás haciendo puedes tocar las variables globales de un módulo con la misma notación que se usa para referirse a sus funciones,
modname.itemname
.
Aquí se describe un uso específico de global-in-a-module: ¿ Cómo comparto variables globales entre módulos? , y para que esté completo, los contenidos se comparten aquí:
La forma canónica de compartir información entre módulos dentro de un solo programa es crear un módulo de configuración especial (a menudo llamado config o cfg ). Simplemente importe el módulo de configuración en todos los módulos de su aplicación; el módulo luego pasa a estar disponible como nombre global. Debido a que sólo hay una instancia de cada módulo, cualquier cambio realizado en el objeto del módulo se refleja en todas partes. Por ejemplo:
Archivo: config.py
x = 0 # Default value of the 'x' configuration setting
Archivo: mod.py
import config
config.x = 1
Archivo: principal.py
import config
import mod
print config.x
Python utiliza una heurística simple para decidir desde qué ámbito debe cargar una variable, entre local y global. Si el nombre de una variable aparece en el lado izquierdo de una asignación, pero no se declara global, se supone que es local. Si no aparece en el lado izquierdo de una tarea, se supone que es global.
>>> import dis
>>> def foo():
... global bar
... baz = 5
... print bar
... print baz
... print quux
...
>>> dis.disassemble(foo.func_code)
3 0 LOAD_CONST 1 (5)
3 STORE_FAST 0 (baz)
4 6 LOAD_GLOBAL 0 (bar)
9 PRINT_ITEM
10 PRINT_NEWLINE
5 11 LOAD_FAST 0 (baz)
14 PRINT_ITEM
15 PRINT_NEWLINE
6 16 LOAD_GLOBAL 1 (quux)
19 PRINT_ITEM
20 PRINT_NEWLINE
21 LOAD_CONST 0 (None)
24 RETURN_VALUE
>>>
Vea cómo baz, que aparece en el lado izquierdo de una tarea en foo()
, es la única LOAD_FAST
variable.
Si desea hacer referencia a una variable global en una función, puede usar la palabra clave global para declarar qué variables son globales. No es necesario usarlo en todos los casos (como alguien aquí afirma incorrectamente): si el nombre al que se hace referencia en una expresión no se puede encontrar en el ámbito local o en los ámbitos de las funciones en las que está definida esta función, se busca entre los globales. variables.
Sin embargo, si asigna una nueva variable no declarada como global en la función, se declara implícitamente como local y puede eclipsar cualquier variable global existente con el mismo nombre.
Además, las variables globales son útiles, al contrario de algunos fanáticos de la programación orientada a objetos que afirman lo contrario, especialmente para scripts más pequeños, donde la programación orientada a objetos es excesiva.