python3 funcion example comando python exec global

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.