2009-10-19 19 views

Respuesta

17

Cuando usted dice

global var 

le está diciendo a Python que es la misma var var que se definió en un contexto global. Se podría utilizar de la siguiente manera:

var=0 
def f(): 
    global var 
    var=1 
f() 
print(var) 
# 1 <---- the var outside the "def f" block is affected by calling f() 

Sin la sentencia global, la var dentro del bloque "def f" sería una variable local, y estableciendo su valor no tendría ningún efecto sobre la var fuera el bloque "def f".

var=0 
def f(): 
    var=1 
f() 
print(var) 
# 0 <---- the var outside the "def f" block is unaffected 

Cuando dice globals.update (var) que supongo que en realidad significa globales(). Actualización (var). Vamos a separarlo.

globals() Devuelve un objeto dict. Las claves del dict son los nombres de los objetos, y los valores del dict son los valores del objeto asociado.

Cada dict tiene un método llamado "actualización". Así que globals(). Update() es una llamada a este método. El método de actualización espera al menos un argumento, y se espera que ese argumento sea un dict. Si le dice a Python

globals().update(var) 

entonces había var ser mejor un diccionario, y le está diciendo a Python para actualizar las variables globales() dict con el contenido de la dict var.

Por ejemplo:

#!/usr/bin/env python 

# Here is the original globals() dict 
print(globals()) 
# {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': '/home/unutbu/pybin/test.py', '__doc__': None} 

var={'x':'Howdy'} 
globals().update(var) 

# Now the globals() dict contains both var and 'x' 
print(globals()) 
# {'var': {'x': 'Howdy'}, 'x': 'Howdy', '__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': '/home/unutbu/pybin/test.py', '__doc__': None} 

# Lo and behold, you've defined x without saying x='Howdy' ! 
print(x) 
Howdy 
+0

Ok por lo que, si tuviera una variable declarada en un método, y en ese método llamados globales() actualización ('var': '0'). Sólo durante la primera ejecución de la secuencia de comandos, no podría usar 'var' de la misma manera que una variable que ha sido declarada como "var global", a lo largo del resto del código en la segunda ejecución de la secuencia de comandos? – frank

+0

globals(). Update ('var': '0') debe ser global(). Update ({'var': '0'}). Esto afectará a la variable global 'var', incluso si este comando se puso dentro de un método. El comportamiento de estos comandos es el mismo en cada ejecución del script. Si esto no responde su pregunta, publique su código para que podamos entenderlo mejor. – unutbu

+0

Ok, es corto pero el formato será raro: intento: \t i + 1 = excepto NameError: \t i = 0 . Ese código estará en un método principal, y no puedo cambiarlo, ni agregar ninguna declaración de método antes del código/fuera del método. Lo que puedo hacer es agregar código en el método principal después de este pequeño fragmento de código. Necesito hacer que 'yo' actúe como una variable global, de modo que aumentará en '1' en cada ejecución de script sucesiva. – frank

Cuestiones relacionadas