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相关推荐

  1. python eval 入门_Python学习笔记整理3之输入输出、python eval函数

    Python学习笔记整理3之输入输出.python eval函数 来源:中文源码网    浏览: 次    日期:2018年9月2日 Python学习笔记整理3之输入输出.python eval函数 ...

  2. Python eval()函数的使用

    Python eval()函数的使用 文章目录 一.官网给出的定义 1.eval() 方法的语法: 二.eval的作用 1.计算字符串中有效的表达式,并返回结果 2.将字符串转成相应的对象(如list ...

  3. Python:eval的妙用和滥用

    时间 2014-07-08 13:05:24 CSDN博客 原文  http://blog.csdn.net/zhanh1218/article/details/37562167 主题 Python ...

  4. Python eval 与 exec 函数的区别 - Python零基础入门教程

    目录 一.Python eval 与 exec 函数的区别 二.价值 10 个亿的智能机器人核心代码 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Py ...

  5. Python eval 函数 - Python零基础入门教程

    目录 一.前言 二.Python eval 函数简介 三.Python eval 函数实战 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python ...

  6. Python eval 与 exec 函数区别 - Python零基础入门教程

    目录 一.Python eval 与 exec 函数的区别 二.价值 10 个亿的智能机器人核心代码 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Py ...

  7. Python eval 与 exec 函数 - Python零基础入门教程

    目录 一.前言 二.Python eval 与 exec 函数简介 三.Python eval 与 exec 函数使用 1.exec 函数执行代码段 2.exec 函数执行 py 文件 四.猜你喜欢 ...

  8. Python eval 函数 -Python零基础入门教程

    目录 一.前言 二.Python eval 函数简介 三.Python eval 函数实战 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python ...

  9. [转载] python eval序列化函数

    参考链接: Python eval() 写监控程序时,获取一串数据,对其解析,用到了eval函数简单理解和转换字符串函数功用一样,str()更常用一些,经常需要转化为字符串类型: eval就是将字符串 ...

  10. Python eval()函数

    Python eval()函数 eval()是python的一个内置函数,这个函数接受的参数是字符串,它返回字符串的表达式的结果.可以用来传递一个列表外面包着一层字符串给它,返回列表本身.在Paddl ...

最新文章

  1. 《剑指offer》-逐层打印二叉树
  2. 用Spark实现简单的单词统计
  3. 安卓开发必备知识体系:安卓篇
  4. 随时随地办公新常态 还需安全来相伴
  5. Junit使用方法总结
  6. Springboot自定义注解实现用户登录状态校验(一)
  7. 手机编程环境初尝试-用AIDE开发Android应用
  8. extract进程 oracle,OracleGoldenGate系列:Extract进程的恢复原理
  9. delete trancate drop三者之间的区别
  10. NEWSCTF第二届--官方wp(2021.6.1萌新赛)
  11. jetson nano使用python读取解析GPS数据(GPRMC,GPGGA)。
  12. 「经典题」完整的前端项目开发流程
  13. 解决虚拟机桥接模式无法上网的问题
  14. 激光技术领域的又一重大突破:光学频率梳
  15. 英雄联盟掉线后显示无法连接服务器,英雄联盟掉线连不上出现英文窗口解决方案...
  16. Mybatis-plus学习-最全细致讲解
  17. 财务报表版本在开发报表中的应用
  18. 接上篇手工课 材料:美女图片一张, 要求将其制成 边旋转边渐隐的魔幻图片
  19. 直播弹幕互动游戏如何开播?
  20. [牛客练习] 深信服校园招聘c/c 软件开发H卷 Apare_xzc

热门文章

  1. 【运动学】基于matlab GUI不等半径泊车方法仿真【含Matlab源码 691期】
  2. 【图像分割】基于matlab GAC水平集方法图像分割【含Matlab源码 389期】
  3. 【语音分离】基于matlab FastICA语音信号采集+混合+分离【含Matlab源码 008期】
  4. 阿里巴巴《rocketmq开发指南》_主流消息中间件优劣:ActiveMQ,RabbitMQ,Kafka,RocketMQ...
  5. 计算机装调与维护报告,Vmware workstation在计算机装调与维护实训中的应用
  6. java考ccf_CCF考试试题之门禁系统java解题代码
  7. MATLAB的sum函数
  8. 快速掌握用python写并行程序设计_Python中的并行编程速度
  9. 一本shell编程书籍上的有bug的shell程序,看谁能找出问题所在。
  10. mysql中 show index from tb_name命令各列的含义