Python eval()和exec()函数

相同点:eval()和exec()在一定命名空间范围内执行字符串形式的代码

不同点:exec()无返回值;eval()有返回值

格式:

eval(expression, globals=None, locals=None, /)
exec(expression, globals=None, locals=None, /)

参数含义:

expression:需要执行的字符串命令

globals:全局命名空间,即 expression 可以使用全局命名空间中的函数

local:局部命名空间(当局部命名空间与全局命名空间重复时,以局部命名空间为准)

globals用法:

dic={} #定义一个字典
dic['b'] = 3 #在 dic 中加一条元素,key 为 b
print (dic.keys()) #先将 dic 的 key 打印出来,有一个元素 b
exec("a = 4", dic) #在 exec 执行的语句后面跟一个作用域 dic
print(dic.keys()) #exec 后,dic 的 key 多了一个

运行结果:

dict_keys(['b'])
dict_keys(['b', '__builtins__', 'a'])

可以看到系统在 dic 中生成了两个新的 key,分别是 a 和 __builtins__。其中,a 为执行语句生成的变量,系统将其放到指定的命名空间;__builtins__ 是系统加入的内置 key。

local用法:

a=10
b=20
c=30
g={'a':6, 'b':8}
t={'b':100, 'c':10}
print(eval('a+b+c', g, t))

运行结果:

116

可以看出取到了a=6,b=100,c=6,因为在全局命名空间g与局部命名空间t中'b'重复,所以重复值取到局部空间t中的b=100

eval()和exec()的区别:

a = 1
exec("a = 2") #相当于直接执行 a=2
print(a)
a = exec("2+3") #相当于直接执行 2+3,但是并没有返回值,a 应为 None
print(a)
a = eval('2+3') #执行 2+3,并把结果返回给 a
print(a)

运行结果:

2
None
5

tips:eval()所需执行的字符串命令必须是要有返回值的!如:a=eval("a = 2")会报SyntaxError错误

猜你喜欢

转载自www.cnblogs.com/lishanstudy/p/12820273.html