python eval()python
eval(expression, globals= None, locals= None)express
--官方文档中的解释:编程
将字符串str当成有效的表达式子来求值并返回计算结果。安全
globals(全局)和locals(局部)参数是可选的,若是提供了globals参数,那么它必须是dictionary类型;编程语言
若是提供了locals参数,那么它能够是任意的map对象。函数
python查找变量的顺序:局部--> 全局--> 内置spa
三个参数的使用:code
一、在前两个参数省略的状况下,eval在当前的做用域执行:对象
a=10; print(eval("a+1"))
执行结果为:11blog
在这种状况下,后两个参数省略了,因此eval中的a是前面的10。对于eval,它会将第一个expression字符串参数的引号去掉,而后对引号中的式子进行解析和计算。
二、在globals指定的状况下:
a=10; g={'a':4} print(eval("a+1",g))
执行结果为:5
这里面可能有点绕啊,初学者得理理清楚。在此次的代码中,咱们在 eval中提供了globals参数,这时候eval的做用域就是g指定的这个字典了,也就是外面的a=10被屏蔽掉了,eval是看不见的,因此使用了a为4的值。
三、在 locals指定的状况下 :
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是起决定做用的,这在不少编程语言里都是同样的,是做用域的覆盖问题,当前指定的小的做用域会覆盖之前大的做用域,这能够理解为一张小的纸盖在了一张大的纸上,纸是透明的,上面写的东西是不透明的,而它们重合的地方就能够理解成两个做用域冲突的地方,天然是小的显现出来了。
eval()的用法:
能够把list, tuple, dict和string相互转化。例子:
#字符串转数字
a = '2'
b = '3'
c = eval(a + b)
c
Out : 5
type(c)
Out : int
#字符串转列表 a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" b = eval(a) b Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]] type(b) Out[4]: list #字符串转字典 a = "{1: 'a', 2: 'b'}" b = eval(a) b Out[7]: {1: 'a', 2: 'b'} type(b) Out[8]: dict #字符串转元组 a = "([1,2], [3,4], [5,6], [7,8], (9,0))" b = eval(a) b Out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
须要注意的是,eval()函数的安全性问题
想想这种使用环境:须要用户输入一个表达式,并求值。
若是用户恶意输入,例如:
__import__('os').system('dir')
那么eval()以后,你会发现,当前目录文件都会展示在用户前面。
那么继续输入:
open('文件名').read()
代码都给人看了。获取完毕,一条删除命令,文件消失。