20

I want to assign :

x0='123'    
x1='123'    
x2='123'    
x3='123'    
x4='123'    
x5='123'    
x6='123'    
x7='123'    
x8='123'    
x9='123'    

I write the code to express that i can get the output of a string 123 when input x1 or x8 .

for i in range(0,10):
    eval("x"+str(i)+"='123'")

Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<string>", line 1
  x0='123'
  ^
SyntaxError: invalid syntax

How i can do that way?

showkey
  • 479
  • 37
  • 122
  • 257
  • 7
    Obligatory link: [Keep data out of your variable names](http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html). Don't use `eval` to create variables. Use a list or dictionary instead. – Martijn Pieters Mar 21 '14 at 12:20
  • 2
    `eval()` only allows for *expressions*. Assignment is not an expression but a statement. – Martijn Pieters Mar 21 '14 at 12:21
  • 1
    Use `exec` for statements not `eval`, as Martijn said use a list/dictionary. – Ashwini Chaudhary Mar 21 '14 at 12:21
  • possible duplicate of [Can I use 'eval' to define a function in Python?](http://stackoverflow.com/questions/19742138/can-i-use-eval-to-define-a-function-in-python) – Ashwini Chaudhary Mar 21 '14 at 12:23

3 Answers3

42

For dynamic execution of statements use the exec function:

>>> exec('y = 3')
>>> y
3

eval usage: eval(expression).

The expression argument is parsed and evaluated as a Python expression.

e.g.:

>>> s = 3
>>> eval('s == 3')
True
>>> eval('s + 1')
4
>>> eval('s')
3
>>> eval('str(s) + "test"')
'3test'
MrGeek
  • 21,097
  • 4
  • 28
  • 52
suhailvs
  • 17,521
  • 10
  • 95
  • 95
24

eval() only allows for expressions. Assignment is not an expression but a statement; you'd have to use exec instead.

Even then you could use the globals() dictionary to add names to the global namespace and you'd not need to use any arbitrary expression execution.

You really don't want to do this, you need to keep data out of your variable names and use a list or dictionary instead:

x = ['123'] * 10

would give you a list you can address as x[0], x[1], etc. without having to execute arbitrary expressions.

Martijn Pieters
  • 963,270
  • 265
  • 3,804
  • 3,187
-3

You can you this expression.

eval('"x"+str(i)+"="+"123"')
Exa
  • 3,941
  • 6
  • 45
  • 59
user3164787
  • 17
  • 1
  • 7