博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python-eval()函数
阅读量:6610 次
发布时间:2019-06-24

本文共 1607 字,大约阅读时间需要 5 分钟。

python eval()

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

--官方文档中的解释:

将字符串str当成有效的表达式子来求值并返回计算结果。

globals(全局)和locals(局部)参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;

如果提供了locals参数,那么它可以是任意的map对象。

 

python查找变量的顺序:局部--> 全局--> 内置

 三个参数的使用:

1、在前两个参数省略的情况下,eval在当前的作用域执行:

a=10;print(eval("a+1"))

执行结果为:11

        在这种情况下,后两个参数省略了,所以eval中的a是前面的10。对于eval,它会将第一个expression字符串参数的引号去掉,然后对引号中的式子进行解析和计算。

 

2、在globals指定的情况下:

a=10;g={
'a':4}print(eval("a+1",g))

执行结果为:5

        这里面可能有点绕啊,初学者得理理清楚。在这次的代码中,我们在 eval中提供了globals参数,这时候eval的作用域就是g指定的这个字典了,也就是外面的a=10被屏蔽掉了,eval是看不见的,所以使用了a为4的值。

 

3、在 locals指定的情况下 :

a=10b=20c=30g={
'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)bOut[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]type(b)Out[4]: list#字符串转字典a = "{1: 'a', 2: 'b'}"b = eval(a)bOut[7]: {
1: 'a', 2: 'b'}type(b)Out[8]: dict#字符串转元组a = "([1,2], [3,4], [5,6], [7,8], (9,0))"b = eval(a)bOut[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))

 

 

 

需要注意的是,eval()函数的安全性问题

 

想一想这种使用环境:需要用户输入一个表达式,并求值。

 

如果用户恶意输入,例如:

 

__import__('os').system('dir')

 

那么eval()之后,你会发现,当前目录文件都会展现在用户前面。

 

那么继续输入:

 

open('文件名').read()

 

代码都给人看了。获取完毕,一条删除命令,文件消失。

 

转载于:https://www.cnblogs.com/Xuuuuuu/p/10127029.html

你可能感兴趣的文章
OpenCV+MFC显示图像
查看>>
第2章 数字之魅——子数组的最大乘积
查看>>
POJ 3414--Pots(BFS+回溯路径)
查看>>
WCF技术剖析之八:ClientBase<T>中对ChannelFactory<T>的缓存机制
查看>>
SQL2008-功能设置
查看>>
Win10 UWP开发中的重复性静态UI绘制小技巧 2
查看>>
jquery.validate运用和扩展
查看>>
Eclipse 扩展点常量ID
查看>>
作业配置规范文档[MS SQL]
查看>>
VNC的安装与配置
查看>>
Android中UI线程与后台线程交互设计的5种方法
查看>>
JDBC公共动作类
查看>>
poj 3013 Big Christmas Tree (dij+优先级队列优化 求最短)
查看>>
JUnit单元测试
查看>>
windows 获取以及更改CMD控制台编码[转]
查看>>
[logstash-input-file]插件使用详解
查看>>
Java RMI
查看>>
HDU 3103 Shoring Up the Levees(计算几何 搜寻区域)
查看>>
专车新规或下周发布,估计有大量司机流失
查看>>
spring mvc模拟用户增删改查以及登录和上传文件的相关流程
查看>>