33

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?


Do not ever use eval (or exec) on data that could possibly come from outside the program in any form. It is a critical security risk. You allow the author of the data to run arbitrary code on your computer. If you are here because you want to create multiple variables in your Python program following a pattern, you almost certainly have an XY problem. Do not create those variables at all - instead, use a list or dict appropriately.

3
  • 8
    Obligatory link: Keep data out of your variable names. Don't use eval to create variables. Use a list or dictionary instead. Commented Mar 21, 2014 at 12:20
  • 2
    eval() only allows for expressions. Assignment is not an expression but a statement. Commented Mar 21, 2014 at 12:21
  • 1
    Use exec for statements not eval, as Martijn said use a list/dictionary. Commented Mar 21, 2014 at 12:21

3 Answers 3

55

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'
Sign up to request clarification or add additional context in comments.

Comments

27

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.

Comments

-3

You can you this expression.

eval('"x"+str(i)+"="+"123"')

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.