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

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

eval(source[, globals[, locals]])

作用:

       将字符串str当成有效的表达式来求值并返回计算结果。参数:source:一个Python表达式或函数compile()返回的代码对象;globals:可选。必须是dictionary;locals:可选。任意map对象。

实例:

1 ################################################# 2 字符串转换成列表 3 >>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" 4 >>>type(a) 5 
6 >>> b = eval(a) 7 >>> print b 8 [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]] 9 >>> type(b)10
11 #################################################12 字符串转换成字典13 >>> a = "{1: 'a', 2: 'b'}"14 >>> type(a)15
16 >>> b = eval(a)17 >>> print b18 {1: 'a', 2: 'b'}19 >>> type(b)20
21 #################################################22 字符串转换成元组23 >>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"24 >>> type(a)25
26 >>> b = eval(a)27 >>> print b28 ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))29 >>> type(b)30
1 #test eval() and locals() 2 x = 1 3 y = 1 4 num1 = eval("x+y") 5 print (num1) 6  7 def g():     8     x = 2     9     y = 2  10     num3 = eval("x+y")    11     print (num3)        12     num2 = eval("x+y",globals())   13     #num2 = eval("x+y",globals(),locals())    ##如果 globals() 和 locals()同时出现 两者有交叉部分的时候,则后者会覆盖掉前者的作用,也就是使用后者环境中的变量 ,参考:http://lib.csdn.net/article/python/62300?knid=165 具体理解14     print (num2)15     16 g()17 18 print locals()["x"]19 print locals()["y"] 20 print globals()["x"]21 print globals()["y"]

num1的值是2;num3的值也很好理解,是4;num2的值呢?由于提供了globals()参数,那么首先应当找全局的x和y值,也就是都为1,那么显而易见,num2的值也是2。如果注释掉该句,执行下面一句呢?根据第3)点可知,结果为4

eval()使用原因:

     1)在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以,意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。

     2)在machin learning里根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。

注:

     eval有安全性问题,比如用户恶意输入就会获得当前目录文件

eval("__import__('os').system('dir')")
1 >>> import os2 >>> 'os' in globals()3 True4 >>> os.system('whoami')5 ap\zhail

怎么避免安全问题?

1、自行写检查函数;

2、使用ast.literal_eva

 

转自:https://www.cnblogs.com/guyuyuan/p/6884115.html

转载于:https://www.cnblogs.com/loved/p/8697643.html

你可能感兴趣的文章
Keil C51 的printf
查看>>
关于指针
查看>>
C 語言中的 sprintf() 函數
查看>>
VMware Worstation下载安装
查看>>
Qt操作Sqlite数据库
查看>>
java生产者与消费者模式
查看>>
SPOJ #442 Searching the Graph
查看>>
窗体美化,IrisSkin2.dll的使用!
查看>>
C语言声明数组变量时,在什么情况下,可不指定数组大小
查看>>
对模拟博客园登陆的改进---软件的开发规范
查看>>
简易csv解析
查看>>
JS案例之4——Ajax多图上传
查看>>
登陆系统的设计2 - 登陆页面的三种形式
查看>>
位运算---水题
查看>>
原码 反码 补码 移码
查看>>
mysql事务之savepoint
查看>>
日常零碎总结
查看>>
循序渐进开发WinForm项目(6)--开发使用混合式Winform模块
查看>>
在WinForm应用程序中快速实现多语言的处理
查看>>
阿里腾讯开撕,钉钉的广告打到腾讯的地盘了
查看>>