3191 votos

El uso de variables globales en una función distinta de la que los creó

Si puedo crear una variable global en una función, ¿cómo puedo usar esa variable en otra función?
¿Necesito almacenar la variable global en una variable local de la función que necesita su acceso?

4327voto

Paul Stephenson Puntos 17507

NOTA: En Python 3, cambie globvar a global. Referencia


Usted puede usar una variable global en otras funciones al declarar como global en cada una de las funciones que le asigna:

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

Me imagino que la razón para ello es que, dado que las variables globales son tan peligrosas, Python, quiere cerciorarse de que usted sabe realmente que es lo que estás jugando con explícitamente que requieren la global de palabras clave.

Ver otras respuestas, si quieres compartir una variable global a través de módulos.

782voto

Jeff Shannon Puntos 3439

Si estoy entendiendo su situación correctamente, lo que estamos viendo es el resultado de la forma en Python maneja local (función) y global (módulo) de los espacios de nombres.

Dices que tienes un módulo como este:

# sample.py
myGlobal = 5

def func1():
    myGlobal = 42

def func2():
    print myGlobal

func1()
func2()

Usted puede esperar para imprimir el 42, pero en lugar de que se imprime 5. Como ya se ha mencionado, si se agrega un 'global' de la declaración de func1(), a continuación, func2() imprime 42.

def func1():
    global myGlobal
    myGlobal = 42

¿Qué está pasando aquí es que en Python se supone que cualquier nombre que se asigna, en cualquier lugar dentro de una función, es local a la función, a menos que explícitamente se indique lo contrario. Si es sólo la lectura de un nombre, y el nombre de no existir a nivel local, intentará buscar el nombre en cualquiera de los ámbitos contenedores (ej. el módulo del ámbito global).

Cuando se asigna 42 para el nombre myGlobal, por lo tanto, Python crea una variable local que las sombras de la variable global del mismo nombre. Que el local queda fuera del ámbito de aplicación y recolección de basura cuando func1() devuelve; mientras tanto, func2() nunca puede ver otra cosa que el (sin modificar) nombre global. Tenga en cuenta que este espacio de decisión que ocurre en tiempo de compilación, no en tiempo de ejecución -- si se va a leer el valor de myGlobal dentro de func1() antes de asignar a la misma, obtiene un UnboundLocalError, porque Python ya ha decidido que debe ser una variable local, pero no ha tenido ningún valor asociado con él todavía. Pero mediante el uso de 'global' declaración, usted le dice a Python que debe buscar en otra parte el nombre, en lugar de asignar a nivel local.

(Creo que este comportamiento se originó en gran medida a través de una optimización de los locales de espacios de nombres -- sin este comportamiento, Python VM tendría que realizar al menos tres búsquedas de nombre cada vez que un nuevo nombre se asigna dentro de una función (para asegurarse de que el nombre no existe en el módulo/builtin nivel), lo que podría ralentizar considerablemente una operación muy común.)

228voto

gimel Puntos 30150

Puede que desee explorar la noción de espacios de nombres. En Python, el módulo es el lugar natural para el mundial de datos:

Cada módulo tiene su propia tabla de símbolos, el cual es utilizado como el símbolo mundial de la tabla por todas las funciones definidas en el módulo. Por lo tanto, el autor de un módulo puede usar variables globales en el módulo sin tener que preocuparse acerca de los choques accidentales con un usuario de variables globales. Por otro lado, si usted sabe lo que está haciendo puede tocar un módulo global de las variables con la misma notación utilizada para referirse a sus funciones, modname.itemname.

Un uso específico del mundial-en-un-módulo se describe aquí - how-do-i-compartir-global-variables-a través de módulos:

La canónica manera de compartir información a través de módulos dentro de un único programa es para crear una configuración especial del módulo (a menudo llamado config o cfg). Acaba de importar el módulo de configuración de todos los módulos de la aplicación; el módulo se convierte en disponible como un nombre global. Porque no es sólo una instancia de cada módulo, los cambios realizados en el módulo de objeto 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: main.py

import config
import mod
print config.x

96voto

IfLoop Puntos 59461

Python utiliza un simple heurística para decidir qué ámbito se debe cargar en una variable a partir de, entre lo local y lo global. Si un nombre de variable aparece en el lado izquierdo de una asignación, pero no es declarada global, se supone que es ser local. Si no aparece en el lado izquierdo de una asignación, 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        
>>> 

Ver cómo baz, que aparece en el lado izquierdo de una asignación en foo(), es la única LOAD_FAST variable.

64voto

J S Puntos 439

Si desea hacer referencia a una variable global en una función, puede usar global palabra clave para declarar que las variables son globales. Usted no tiene que utilizar en todos los casos (como alguien de aquí incorrectamente reclamaciones) - si el nombre que se hace referencia en una expresión que no se encuentra en locales de ámbito o ámbitos en las funciones en que esta función se define, se busca entre las variables globales. Sin embargo, si se asigna a una variable no declarada como global en la función, se ha declarado implícitamente como local, y puede eclipsar cualquier existentes variable global con el mismo nombre.

También, las variables globales son útiles, de lo contrario a la programación orientada a objetos fanáticos que afirman lo contrario - sobre todo para los pequeños scripts, donde la programación orientada a objetos es una exageración.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X