技术标签: Python
eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。想象一下变量赋值时,将等号右边的表达式写成字符串的格式,将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果。
eval函数就是实现list、dict、tuple与str之间的转化,str函数把list,dict,tuple转为为字符串
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
print(type(a))
b = eval(a)
print(type(b))
print(b)
二、字符串转换成字典
a = "{1: 'a', 2: 'b'}"
print(type(a))
b = eval(a)
print(type(b))
print(b)
三、字符串转换成元组
a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
print(type(a))
b=eval(a)
print(type(b))
print(b)
python中eval函数的用法十分的灵活,但也十分危险,安全性是其最大的缺点。本文从灵活性和危险性两方面介绍eval。
1、强大之处
举几个例子感受一下,字符串与list、tuple、dict的转化。
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,eval给你一个表达式返回值。
eval的语法格式如下:
eval(expression[, globals[, locals]])
expression : 字符串
globals : 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals : 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
结合globals和locals看看几个例子
传递globals参数值为{“age”:1822},
eval("{'name':'linux','age':age}",{"age":1822})
输出结果:{‘name’: ‘linux’, ‘age’: 1822}
再加上locals变量
age=18
eval("{'name':'linux','age':age}",{"age":1822},locals())
根据上面两个例子可以看到当locals参数为空,globals参数不为空时,查找globals参数中是否存在变量,并计算。
当两个参数都不为空时,先查找locals参数,再查找globals参数,locals参数中同名变量会覆盖globals中的变量。
2、危险之处
eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。
假设用户恶意输入。比如:
eval("__import__('os').system('ls /Users/chunming.liu/Downloads/')")
那么eval()之后,你会发现,当前文件夹文件都会展如今用户前面。这句其实相当于执行了
os.system('ls /Users/chunming.liu/Downloads/')
那么继续输入:
eval("__import__('os').system('cat /Users/chunming.liu/Downloads/tls_asimov_cert.pem')")
代码都给人看了。
再来一条删除命令,文件消失。比如
eval("__import__('os').system('rm /Users/chunming.liu/Downloads/车辆转发测试.png')")
所以使用eval,一方面享受他的了灵活性同时,也要注意安全性。
>>号外:关注“Java精选”公众号,回复“面试资料”,免费领取资料!“Java精选面试题”小程序,3000+ 道面试题在线刷,最新、最全 Java 面试题!我是一个比较爱玩游...
标题很酷炫,虽然说出来这句话有些虚~emmmmmmmm…【言归正传】SPPnet出来之后,RBG大神迅速回怼,抛出了更快更好的Fast-RCNN。**新的思路是,**将之前的多阶段训练合并成了单阶段训练,面对灵活尺寸问题,大神借鉴了空间金字塔的思路,使用了一层的空间金字塔。0. 摘要本文提出了一个快速的基于区域推荐的卷积网络方法(Fast R-CNN)用于对象检测。Fast R-CNN在前人工...
一、选择题1.使用vim编辑只读文件时,强制存盘并退出的命令是( C )。A.【:w!】 B.【:q!】 C .【:wq!】 D.【:e!】2.使用(A )命令可以把两个文件合并成一个文件。A.【cat】 B.【grep】 C.【awk】 D.【cut】3.使用ls -al命令列出...
beginthread和beginthreadex的使用方法建立一个线程。unsigned long beginthread(void(cdecl *startaddress)(void*),unsigned stacksize, void *arglist);unsigne dlong beginthreadex(void *security,unsigned
转自:http://blog.chinaunix.net/uid-26758020-id-3184179.html1. 使用uvesafb修改控制台模式分辨率 安装uvesafb信赖包,查看显卡支持的fb的分辨率 sudo apt-getinstall v86d hwinfo sudo hwinfo--framebuffer2.修改内核配置
使用Filter实现用户登录创建相关目录:1.编写User类该类用于封装用户信息,代码如下:2.实现登录页面和首页(1)创建一个login.jsp页面,该页面用于创建一个用户登录的表单,这个表单需要填写用户名和密码,以及自动登录的时间,代码如下:(2)编写一个index.jsp页面,该页面用于显示用户的登录信息,代码如下:3.创建Servlet(1)编写LoginServlet类,该类用于处理用户登录请求,代码如下:(2)编写LogoutServlet类,该类用于注销用户登录信息,代码如
本文介绍队列的基本知识,详细源码分析见《FreeRTOS高级篇5---FreeRTOS队列分析》1.FreeRTOS队列 队列是主要的任务间通讯方式。可以在任务与任务间、中断和任务间传送信息。大多数情况下,队列用于具有线程保护的FIFO(先进先出)缓冲区:新数据放在队列的后面。当然,数据也可以放在队列的前面,在下一篇讲队列API函数时,会涉及到数据的存放位置。图1-1:读写队列 图1-1所示的队列中,最多能保存5个项目,并且假设队列永远不会满。任务A使用API函...
写在开头微前端系列文章:基于 qiankun 的微前端最佳实践(万字长文) - 从 0 到 1 篇基于 qiankun 的微前端最佳实践(图文并茂) - 应用部署篇基于 qiankun 的微前端最佳实践(图文并茂) - 应用间通信篇万字长文+图文并茂+全面解析微前端框架 qiankun 源码 - qiankun 篇本系列其他文章计划一到两个月内完成,点个 关注 不迷路。计划如下:生命周期篇;IE 兼容篇;性能优化、缓存方案篇;引言大家好~我们是明源云链前端团队,我们使用 q.
机器学习--贝叶斯分类作者:wangxinxi贝叶斯分类已经是老生常谈了,应用也很广泛,但是我发现资料有些是偏于理论, 有些是偏于堆积代码, 遂有写此blog的想法,希望能帮助到一部分人。本文难免有错误之处,希望能指出来1、男女的问题试想一下,你前往影院看电影,突然发现前面看电影的一个人的门票掉在了地上,,此刻应该是我们发扬中华民族传统美德的是时候了!但是你偏偏只看到了背景,通过看到的背景推断,那...
----------------------android培训、java培训、期待与您交流! ---------------------1.反射概述Class类代表Java类,它的各个实例对象又分别对应什么?a.对应各个类在内存中的字节码。b.一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以他们在内存中的内容是