Configuración de variables con exec dentro de una función

Acabo de comenzar a enseñar Python y necesito un poco de ayuda con este script:

old_string = "didnt work" new_string = "worked" def function(): exec("old_string = new_string") print(old_string) function() 

Quiero conseguirlo tan old_string = "worked" .

Ya casi estás ahí. Está intentando modificar una variable global, por lo que debe agregar la statement global :

 old_string = "didn't work" new_string = "worked" def function(): exec("global old_string; old_string = new_string") print(old_string) function() 

Si ejecuta la siguiente versión, verá lo que sucedió en su versión:

 old_string = "didn't work" new_string = "worked" def function(): _locals = locals() exec("old_string = new_string", globals(), _locals) print(old_string) print(_locals) function() 

salida:

 didn't work {'old_string': 'worked'} 

De la forma en que lo ejecutó, terminó tratando de modificar las variables locales de la función en exec , que es básicamente un comportamiento indefinido. Vea la advertencia en los documentos exec :

Nota: los locales predeterminados actúan como se describe para la función locals() continuación: no deben intentarse modificaciones al diccionario local predeterminado. Pase un diccionario de locals explícito si necesita ver los efectos del código en los locales después de que devuelve la función exec() .

y la advertencia relacionada con los locals() :

Nota: El contenido de este diccionario no debe ser modificado; los cambios pueden no afectar los valores de las variables locales y libres utilizadas por el intérprete.

Como una forma alternativa de que exec actualice sus variables globales desde dentro de una función es pasar globals() a ella.

 >>> def function(command): ... exec(command, globals()) ... >>> x = 1 >>> function('x += 1') >>> print(x) 2 

A diferencia de los locals() , se espera que la actualización del diccionario globals() siempre actualice la variable global correspondiente, y viceversa.