Cuál es la diferencia entre inicializar una variable como global var
o llamar al globals().update(var)
.Python: diferencia entre 'global' y globales(). Update (var)
Gracias
Cuál es la diferencia entre inicializar una variable como global var
o llamar al globals().update(var)
.Python: diferencia entre 'global' y globales(). Update (var)
Gracias
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
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
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
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