标签:范围 eval 区别 print mil UNC string 直接 全局
相同点: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错误
标签:范围 eval 区别 print mil UNC string 直接 全局
原文地址:https://www.cnblogs.com/lishanstudy/p/12820273.html