描述
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
语法
以下是 eval() 方法的语法:
eval(expression[, globals[, locals]])
参数
expression -- 表达式。
globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
举例:
x = 7
eval( ‘3 * x’ )
21
eval(‘pow(2,2)’)
4eval(‘2 + 2’)
4n=81
eval(“n + 4”)
85
eval 执行过程: 它会将第一个expression字符串参数的引号去掉,然后对引号中的式子进行解析和计算。
举例一:
a=10;
b={'a':4}
print(eval("a+1",b))
执行结果为:5
这里面可能有点绕啊,初学者得理理清楚。在这次的代码中,
我们在 eval中提供了globals参数,
这时候eval的作用域就是b指定的这个字典了,
也就是外面的a=10被屏蔽掉了,
eval是看不见的,所以使用了a为4的值。
举例二:
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是10。
我们首先来看一下,对于a为6我们是没有疑问的,因为在上个例子中已经说了,g会屏蔽程序中的全局变量的,而这里最主要的是为什么b是100呢?
还记得我们在参数介绍的时候说过,当locals和globals起冲突时,locals是起决定作用的,这在很多编程语言里都是一样的,是作用域的覆盖问题,
当前指定的小的作用域会覆盖以前大的作用域,
这可以理解为一张小的纸盖在了一张大的纸上,
纸是透明的,上面写的东西是不透明的,
而它们重合的地方就可以理解成两个作用域冲突的地方,
自然是小的显现出来了。
举例三:
s="abck"
print(eval(s))
执行的结果为:NameError: name ‘abck’ is not defined
对于当面的代码,我们可以看到,字符串s并不满足表达式的要求。当eval剥去了"abck"的外面的引号的时候,它会对它进行解析,然后满足要求后进行计算,然后它解析到的是abcd,请注意,程序报出的错误是NameError,也就是说,当它解析到这个表达式是不可以计算后,它就会查找它是不是一个变量的名字,如果是一个变量的名字,那么它会输出这个变量的内容,否则就会产生这种报错。
s="abck"
print(eval('s'))
执行的结果为:abck
c=12
b={'a':4, 'b':5}
print(a)
print(eval("a+1+b+c", b))
NameError: name ‘c’ is not defined
只会在b 里面找c , 找不到就报错了!!!