2010-01-18 16 views

Respuesta

22

por the docs, la declaración exec toma dos expresiones opcionales, por defecto a globals() y locals(), y siempre realiza los cambios (si los hay) en el locals() uno.

lo tanto, sólo ser más explícito/específico/precisa ...:

>>> def myfunc(): 
... exec('myvar="boooh!"', globals()) 
... 
>>> myfunc() 
>>> myvar 
'boooh!' 

... y usted será capaz de darle una paliza variables globales para el contenido de su corazón.

+0

¡Perfecto! Gracias, funciona genial :) – linkmaster03

3

¿Qué tal esto:

>>> myvar = 'test' 
>>> def myfunc(): 
...  exec('globals()["myvar"] = "changed!"') 
...  print(myvar) 
... 
>>> myfunc() 
changed! 
>>> print(myvar) 
changed! 

Se trabajó para mí en Python 2.6.

EDIT: En realidad la explicación de Alex Martelli es mucho mejor que la mía :)

+0

Esto funcionó para mí (Python 3.4.1, Win. 8.1) lo anterior no ... – bjd2385

4

Para añadir a la respuesta de Alex: aunque cuando se omite la gente del lugar/globals argumentos que DEFAULT para los locales y globales de la persona que llama, esto sólo una hack de conveniencia; lo hace no significa que están heredando el contexto de ejecución completo de la persona que llama. En particular:

a. las celdas de alcance anidadas no están disponibles para el código ejecutado. Entonces esto falla:

def f(): 
    foo= 1 
    def g(): 
     exec('print foo') 
    g() 
f() 

b. global declaraciones no se transfieren al código ejecutado. De manera predeterminada, como en su ejemplo, las variables escritas se colocan en el diccionario local. Sin embargo, puede hacer que funcione diciendo

exec('global myvar\nmyvar = "changed!"') 

Realmente no desea hacer esto si puede evitarlo. global ya no es bueno y exec es más o menos un olor a código en sí mismo! No querrás combinarlos a menos que realmente no haya otra alternativa.

Cuestiones relacionadas