python内置函数之eval()函数

eval函数

eval函数很有趣,在我的理解中,它没啥作用,但是作用又很大。没有啥作用是因为,eval()函数可以调用被赋值的变量,作用很大是eval()可以自动区分全局变量和局部变量,并且可以优先调用局部变量。全局变量和局部变量在面向对象的使用中很重要。
eval函数里面有三个参数,expression,globals,locals。不详细解释,简单介绍下就好。expression就是你调用的变量,globals默认为None,它指的是全局变量。locals指的是局部变量。调用优先级是局部变量大于全部变量。
了解eval函数之前得先知道eval的使用规则。eval无论传入的是什么。都得先掉一层皮,就是先让参数削掉一层引号。如果没有引号,就会把传入的参数当成一个变量,去局部或者全局查找,如果查找不到就会报错。如果查到变量之后,再削掉一层引号,如果是字符串就输出,如果不是就继续查找,直到查到的是字符串或者数值类型才停止然后输出。

1 直接输出
a = '10'
print(eval(a))

这里输出的是10,
那这个a是什么类型的呢?我们可以用type查看一下

a = '10'
b = type(eval(a))
print(b)

这里输出的<class ‘int’>,a本来是字符串类型,可是经过eval之后就变成了int类型。这是我上面讲过的,就是先削掉一层皮,就是把引号去掉。所以’10’就变成10,也就是从string类型,变成了int类型

2 有全局变量的情况

首先看两个例子

#实例1
a = 10
b={'a':20}
print(eval('a+1',b)) #21

#实例2
a = '10'
b={'a':20}
print(eval(a+'1',b)) #101

对于这两个实例,我刚开始也是一头雾水,但是只需要稍加分析就能得出答案。
由于python解释代码的原理是边编译边执行,所以对于实例1来讲,执行到输出函数print的时候,先遇见的是’a+1’,这时候会去掉外层的’’,变成a+1,很明显这个a是一个变量,再往后执行,就遇见了全局变量b,程序会从前面执行过的语句中优先调用全局变量b,发现字典b里面有个键’a’,将其去掉引号后就是需要的变量a,其对应的是整数型20,再加上1就是21了。
对于实例2来讲,查看到输出语句之后,发现有个a,但是没法去除引号,所以认定他就是个变量,这时不需要找全局变量,直接从程序里面取值即可。发现有个变量a=‘10’,而且是个字符串,再加上本来的字符串’1’,就输出了101这个字符串。

3 有局部变量的情况

# 局部变量
a = '10'
g = {'a':'10','b':'20'}
t = {'b':'30','d':'40'}
print(eval('a+b+d',g,t)) #103040

这个题咋一看很简单,无非是字符串的拼接,问题在于,g和t里面都有b,为什么最终拼出来的结果是b=30?这是因为,当eval里面既有全局变量又有局部变量的时候,优先选择局部变量,所以当g和t都有b的时候,优先选择t里面的b=‘30’

4 NameError情况

#情况1
str = 'abcd'
print(eval('str')) #abcd
情况2
str = 'abcd'
print(eval(str))

Traceback (most recent call last):
  File "f:/练习python/np.py", line 22, in <module>
    print(eval(str))
  File "<string>", line 1, in <module>
NameError: name 'abcd' is not defined

对于情况1按照eval函数的特点,当输出的是eval(‘str’)的时候,先去除’‘留下str,会发现str=‘abcd’,这是后直接输出字符串abcd
对于情况2,按照eval特点,输出的是eval(str),说明str是一个变量,查看执行过的程序会发现前面有一个str=‘abcd’,去除’'后发现留下的是abcd,按照eval特点,发现abcd是一个变量,但是程序里面没有发现abcd赋予的值,所以直接报错NameError

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值