eval(expression, globals=None, locals=None)
1.expression只能是单个表达式,不能是复杂的代码,如赋值、循环等
2.当指定了命名空间后,变量会在对应的命名空间中查找,其值不会覆盖实际其他命名空间中的值
3.返回的是expression的执行结果,在某些情况(print()或列表的append()操作)下,返回值可能是None
exec(object[, globals[, locals]])
1.object是代码块,可执行复杂的代码逻辑,如循环控制代码块, 异常代码块, 类, 函数的定义等,但不会像表达式一样能返回
2.内外的命名空间相通
3.其返回值都是None
针对1:
ml='print("hello everybody")'
exec(ml) # hello everybody
eval(ml) # hello everybody
print(exec(ml)) # hello everybody
# None
print(eval(ml)) # hello everybody
# None
ml='a=1+2'
exec(ml)
# eval(ml) # 报错:SyntaxError: invalid syntax
print(exec(ml)) # None
ml='3+2'
exec(ml)
eval(ml)
print(exec(ml)) # None
print(eval(ml)) # 5
ml="for i in range(0,5):print('iter time: %d' %i)"
exec(ml) #iter time: 0
# iter time: 1
# iter time: 2
# iter time: 3
# iter time: 4
# eval(ml) # 报错:SyntaxError: invalid syntax
针对2:
x=10
def func():
y=20
a=eval("x+y")
print("a : ",a)
b=eval("x+y",{"x":1,"y":2})
print('x: ' + str(x) + ' y: ' + str(y))
print("b : ",b)
c=eval("x+y",{"x":1,"y":2},{"x":3,"z":4})
print('x: ' + str(x) + ' y: ' + str(y))
print("c : ",c)
func() # a : 30
# x: 10 y: 20
# b : 3
# x: 10 y: 20
# c : 5
x=10
def func():
y=20
a=exec("x+y")
print("a : ",a)
b=exec("x+y",{"x":1,"y":2})
print('x: ' + str(x) + ' y: ' + str(y))
print("b : ",b)
c=exec("x+y",{"x":1,"y":2},{"x":3,"z":4})
print('x: ' + str(x) + ' y: ' + str(y))
print("c : ",c)
func() # a : None
# x: 10 y: 20
# b : None
# x: 10 y: 20
# c : None
x=1
y=5
# y=eval("x=1+1") # 报错:SyntaxError: invalid syntax
y=eval("1+1")
print(x) # 1
print(y) # 2
x=1
y=8
y=exec("x=1+1")
print(x) # 2
print(y) # None
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
print(eval(a)) # [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
a = "{'name': 'Python猫', 'age': 18}"
print(eval(a)) # {'name': 'Python猫', 'age': 18}