【转】python eval
eval(expression, globals=None, locals=None) --- 官方文档中的解释是,将字符串str当成有效的表达式来求值并返回计算结果。globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。
python是用命名空间来记录变量的轨迹的,命名空间是一个dictionary,键是变量名,值是变量值。
当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:
1)局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x, 或一个参数 x,Python 将使用它,然后停止搜索。
2)全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
3)内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。
python的全局名字空间存储在一个叫globals()的dict对象中;局部名字空间存储在一个叫locals()的dict对象中。我们可以用print (locals())来查看该函数体内的所有变量名和变量值。
eval()使用原因:
1)在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以,意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。
2)在machin learning里根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。
example:
a=1 g={'a':20} eval("a+1",g)
返回21
#test eval() and locals() x = 1 y = 1 num1 = eval("x+y") print (num1)def g(): x = 2 y = 2 num3 = eval("x+y") print (num3) num2 = eval("x+y",globals()) #num2 = eval("x+y",globals(),locals()) print (num2)g()print locals()["x"] print locals()["y"] print globals()["x"] print globals()["y"]
num1的值是2;num3的值也很好理解,是4;num2的值呢?由于提供了globals()参数,那么首先应当找全局的x和y值,也就是都为1,那么显而易见,num2的值也是2。如果注释掉该句,执行下面一句呢?根据第3)点可知,结果为4
locals()对象的值不能修改,globals()对象的值可以修改
#test globals() and locals()z=0 def f(): z = 1 print (locals()) locals()["z"] = 2 print (locals()) f() globals()["z"] = 2 print (z)
可以得出,两个print (locals())的结果是一样的,说明没有修改成功。而print (z)的值是2,说明修改成功了
eval有安全性问题,比如用户恶意输入就会获得当前目录文件
eval("__import__('os').system('dir')")
>>> import os >>> 'os' in globals() True >>> os.system('whoami') ap\zhail 0
怎么避免安全问题?
1、自行写检查函数;
2、使用ast.literal_eval
参考
https://docs.python.org/2/library/ast.html
http://python.jobbole.com/82770/
http://code.activestate.com/recipes/496746-restricted-safe-/
【转】python eval相关推荐
- python eval 入门_Python学习笔记整理3之输入输出、python eval函数
Python学习笔记整理3之输入输出.python eval函数 来源:中文源码网 浏览: 次 日期:2018年9月2日 Python学习笔记整理3之输入输出.python eval函数 ...
- Python eval()函数的使用
Python eval()函数的使用 文章目录 一.官网给出的定义 1.eval() 方法的语法: 二.eval的作用 1.计算字符串中有效的表达式,并返回结果 2.将字符串转成相应的对象(如list ...
- Python:eval的妙用和滥用
时间 2014-07-08 13:05:24 CSDN博客 原文 http://blog.csdn.net/zhanh1218/article/details/37562167 主题 Python ...
- Python eval 与 exec 函数的区别 - Python零基础入门教程
目录 一.Python eval 与 exec 函数的区别 二.价值 10 个亿的智能机器人核心代码 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Py ...
- Python eval 函数 - Python零基础入门教程
目录 一.前言 二.Python eval 函数简介 三.Python eval 函数实战 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python ...
- Python eval 与 exec 函数区别 - Python零基础入门教程
目录 一.Python eval 与 exec 函数的区别 二.价值 10 个亿的智能机器人核心代码 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Py ...
- Python eval 与 exec 函数 - Python零基础入门教程
目录 一.前言 二.Python eval 与 exec 函数简介 三.Python eval 与 exec 函数使用 1.exec 函数执行代码段 2.exec 函数执行 py 文件 四.猜你喜欢 ...
- Python eval 函数 -Python零基础入门教程
目录 一.前言 二.Python eval 函数简介 三.Python eval 函数实战 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python ...
- [转载] python eval序列化函数
参考链接: Python eval() 写监控程序时,获取一串数据,对其解析,用到了eval函数简单理解和转换字符串函数功用一样,str()更常用一些,经常需要转化为字符串类型: eval就是将字符串 ...
- Python eval()函数
Python eval()函数 eval()是python的一个内置函数,这个函数接受的参数是字符串,它返回字符串的表达式的结果.可以用来传递一个列表外面包着一层字符串给它,返回列表本身.在Paddl ...
最新文章
- 《剑指offer》-逐层打印二叉树
- 用Spark实现简单的单词统计
- 安卓开发必备知识体系:安卓篇
- 随时随地办公新常态 还需安全来相伴
- Junit使用方法总结
- Springboot自定义注解实现用户登录状态校验(一)
- 手机编程环境初尝试-用AIDE开发Android应用
- extract进程 oracle,OracleGoldenGate系列:Extract进程的恢复原理
- delete trancate drop三者之间的区别
- NEWSCTF第二届--官方wp(2021.6.1萌新赛)
- jetson nano使用python读取解析GPS数据(GPRMC,GPGGA)。
- 「经典题」完整的前端项目开发流程
- 解决虚拟机桥接模式无法上网的问题
- 激光技术领域的又一重大突破:光学频率梳
- 英雄联盟掉线后显示无法连接服务器,英雄联盟掉线连不上出现英文窗口解决方案...
- Mybatis-plus学习-最全细致讲解
- 财务报表版本在开发报表中的应用
- 接上篇手工课 材料:美女图片一张, 要求将其制成 边旋转边渐隐的魔幻图片
- 直播弹幕互动游戏如何开播?
- [牛客练习] 深信服校园招聘c/c 软件开发H卷 Apare_xzc
热门文章
- 【运动学】基于matlab GUI不等半径泊车方法仿真【含Matlab源码 691期】
- 【图像分割】基于matlab GAC水平集方法图像分割【含Matlab源码 389期】
- 【语音分离】基于matlab FastICA语音信号采集+混合+分离【含Matlab源码 008期】
- 阿里巴巴《rocketmq开发指南》_主流消息中间件优劣:ActiveMQ,RabbitMQ,Kafka,RocketMQ...
- 计算机装调与维护报告,Vmware workstation在计算机装调与维护实训中的应用
- java考ccf_CCF考试试题之门禁系统java解题代码
- MATLAB的sum函数
- 快速掌握用python写并行程序设计_Python中的并行编程速度
- 一本shell编程书籍上的有bug的shell程序,看谁能找出问题所在。
- mysql中 show index from tb_name命令各列的含义