python - funcion - ¿No puede cambiar las variables globales en una función a través de una declaración exec()?
python exec function (3)
¿Por qué no puedo cambiar las variables globales desde dentro de una función, usando exec ()? Funciona bien cuando la instrucción de asignación está fuera de exec (). Aquí hay un ejemplo de mi problema:
>>> myvar = ''test'' >>> def myfunc(): ... global myvar ... exec(''myvar = "changed!"'') ... print(myvar) ... >>> myfunc() test >>> print(myvar) test
Para agregar a la respuesta de Alex: aunque cuando omites los argumentos locales / globales, estos son predeterminados a los locales y globales de la persona que llama, esto solo es un truco conveniente; no significa que estén heredando el contexto de ejecución completa del llamante. En particular:
a. Las celdas de alcance anidadas no están disponibles para el código execed. Así que esto falla:
def f():
foo= 1
def g():
exec(''print foo'')
g()
f()
segundo. global
declaraciones global
no se transfieren al código anterior. De manera predeterminada, como en su ejemplo, las variables escritas se colocan en el diccionario local. Sin embargo, podrías hacerlo funcionar diciendo
exec(''global myvar/nmyvar = "changed!"'')
Realmente no quieres estar haciendo esto si puedes evitarlo. global
ya no es bueno y exec
es prácticamente un olor de código en sí mismo! No querrías combinarlos a menos que realmente no haya alternativa.
Qué tal esto:
>>> myvar = ''test''
>>> def myfunc():
... exec(''globals()["myvar"] = "changed!"'')
... print(myvar)
...
>>> myfunc()
changed!
>>> print(myvar)
changed!
Me funcionó en Python 2.6.
EDIT: En realidad, la explicación de Alex Martelli es mucho mejor que la mía :)
Según los documentos , la declaración exec
toma dos expresiones opcionales, de manera predeterminada a globals()
y locals()
, y siempre realiza cambios (si los hay) en el locals()
uno.
Entonces, solo sé más explícito / específico / preciso ...
>>> def myfunc():
... exec(''myvar="boooh!"'', globals())
...
>>> myfunc()
>>> myvar
''boooh!''
... y podrá pegar variables globales a los contenidos de su corazón.