¿Cómo utilizar una variable global en una función?

Resuelto user46646 asked hace 15 años • 25 respuestas

¿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 globalpalabra 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 globalpalabra clave.

user46646 avatar Jan 08 '09 12:01 user46646
Aceptado

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 = 1se 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 globalpalabra clave.

Vea otras respuestas si desea compartir una variable global entre módulos.

Paul Stephenson avatar Jan 08 '2009 08:01 Paul Stephenson

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 globaldeclaració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_globalinside 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 globalinstrucció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).

Jeff Shannon avatar Jan 08 '2009 09:01 Jeff Shannon

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
gimel avatar Jan 08 '2009 05:01 gimel

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_FASTvariable.

SingleNegationElimination avatar Jul 12 '2011 12:07 SingleNegationElimination

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.

J S avatar Jan 08 '2009 09:01 J S