109

Okay. So my question is simple: How can I assign the value of a variable using eval in Python? I tried eval('x = 1') but that won't work. It returns a SyntaxError. Why won't this work?

2
  • 3
    What are you trying to do? Whatever you are doing you should not use eval. Commented Apr 8, 2011 at 18:29
  • 7
    Disagree, eval has tons of great uses Commented Jun 9, 2020 at 23:28

6 Answers 6

169

Because x=1 is a statement, not an expression. Use exec to run statements.

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

By the way, there are many ways to avoid using exec/eval if all you need is a dynamic name to assign, e.g. you could use a dictionary, the setattr function, or the locals() dictionary:

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

Update: Although the code above works in the REPL, it won't work inside a function. See Modifying locals in Python for some alternatives if exec is out of question.

Sign up to request clarification or add additional context in comments.

3 Comments

And btw, if you want to change a variable like this, you probably want a dictionary instead.
Probably will use a dictionary next time I do something like this.
Python docs say you shouldn't modify locals(). (docs.python.org/2/library/functions.html#locals) Is there another way to just use assignment without the full evil of eval()?
18

You can't, since variable assignment is a statement, not an expression, and eval can only eval expressions. Use exec instead.

Better yet, don't use either and tell us what you're really trying to do so that we can come up with a safe and sane solution.

Comments

4

you can use lambda, like this:

eval('(lambda x=10: x+2)()')

Comments

1

You can actually put exec() command inside eval()

So your statement would look like eval("exec('x = 1')")

p.s. this is dangerous

Comments

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

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

It works... cause python will actually run assignNewValueToX to be able to evaluate the expression. It can be developed further, but I am sure there is a better option for almost any needs one may have.

1 Comment

Almost, but I need to dynamically assign the variable name. Thanks though.
0

This code works for me

x = [1,2]
exec('x += [10, 5]')

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.