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,723
- 5
- 23
- 35
-
3What are you trying to do? Whatever you are doing you should not use eval. – babsher Apr 08 '11 at 18:29
-
5Disagree, eval has tons of great uses – Joshua Jun 09 '20 at 23:28
5 Answers
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.
-
7And btw, if you want to change a variable like this, you probably want a dictionary instead. – Ned Batchelder Apr 08 '11 at 19:31
-
-
4Python docs say you shouldn't modify `locals()`. (http://docs.python.org/2/library/functions.html#locals) Is there another way to just use assignment without the full evil of `eval()`? – Jason S Jun 04 '13 at 20:56
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.

- 75,757
- 21
- 156
- 151
You can actually put exec()
command inside eval()
So your statement would look like eval("exec('x = 1')")
p.s. this is dangerous

- 11
- 1
- 1
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.

- 5,999
- 2
- 19
- 30
-
Almost, but I need to dynamically assign the variable name. Thanks though. – tew Apr 26 '11 at 23:18