2011-04-08 27 views

Respuesta

80

Porque x=1 es una afirmación, no una expresión. Use exec para ejecutar instrucciones.

>>> exec('x=1') 
>>> x 
1 

Por cierto, hay muchas maneras de evitar el uso de exec/eval si todo lo que necesita es un nombre dinámico para asignar, por ejemplo, se puede usar un diccionario, el setattr function, o la locals() dictionary:

>>> locals()['y'] = 1 
>>> y 
1 

actualización: Aunque el código anterior funciona en el REPL, no va a funcionar dentro de una función. Vea Modifying locals in Python para algunas alternativas si exec está fuera de duda.

+6

Y, por cierto, si quiere cambiar una variable como esta, probablemente quiera un diccionario en su lugar. –

+0

Probablemente use un diccionario la próxima vez que haga algo como esto. –

+3

Python dice que no debe modificar 'locals()'. (http://docs.python.org/2/library/functions.html#locals) ¿Hay alguna otra forma de usar la asignación sin el mal completo de 'eval()'? –

9

No se puede, ya que la asignación de variables es una declaración, no una expresión, y eval solo puede expresiones eval. Use exec en su lugar.

Mejor aún, no use ninguno de los dos y díganos qué es realmente tratando de hacer eso para que podamos encontrar una solución segura y sensata.

0
 
x = 0 
def assignNewValueToX(v): 
    global x 
    x = v 

eval('assignNewValueToX(1)') 
print(x) 

Funciona ... porque python realmente ejecutará assignNewValueToX para poder evaluar la expresión. Se puede desarrollar más, pero estoy seguro de que hay una mejor opción para casi cualquier necesidad que pueda tener.

+0

Casi, pero necesito asignar dinámicamente el nombre de la variable. Gracias sin embargo. –

Cuestiones relacionadas