exec()函数

exec函数用于执行存储在字符串中的python语句

>>> exec("x=1")
>>> x

但有时候,直接这样执行可能会污染我们的命名空间,比如下面的例子,我们使用python内置的abs函数求绝对值。

>>> abs(-)

>>> exec("abs='xyz'")
>>> abs(-)
File "<stdin>", line , in <module>
TypeError: "str" object is not callable

在执行abs函数时报错了,类型错误,字符串类型对象不能被调用,原因就在于我们使用exec函数将字符串xyz赋值给了abs,abs此时已经不再表示求绝对值的函数了。为了防止出现这种情况,我们在调用exec函数时,可以给它传递第二个参数——命名空间,即就是一个字典。

>>> abs(-1)
1
>>> scope = {}
>>> exec("abs='xyz'", scope)
>>> abs(-1)
1
>>>scope['abs']
'xyz'

这样,通过exec执行赋值语句创建的变量就位于scope中,不会污染我们的命名空间。

eval()函数

eval用于执行存储在字符串中的python表达式

>>> eval("1+2+3+4+5")
15

与exec函数一样,我们也可以给eval函数提供命名空间。

总结

1、exec函数执行的是python语句,没有返回值,eval函数执行的是python表达式,有返回值;

2、exec函数和eval函数都可以传入命名空间作为参数,实际上,可以向exec函数和eval函数提供两个命名空间,他们的函数定义为:

exec(source, globals=None, locals=None)

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

其中globals和locals都是可选参数,globals表示全局命名空间,必须是字典,locals表示局部命名空间,可以是任何映射。

3、需要注意的是,exec函数和eval函数都是将用户提供的字符串作为代码执行,将无法控制代码的行为,会带来严重的安全隐患,使用的时候要慎重。

 

最新文章

  1. ATM-PROGRAM 关于Proprties的问题
  2. [Erlang 0123] Erlang EPMD
  3. HTTP API开发
  4. Asp.Net MVC4 + Oracle + EasyUI 学习 第二章
  5. C++的动态内存分配
  6. pip 加速方案
  7. 阿里巴巴集团2016校园招聘-Python工程师笔试题(附加题+部分答案)
  8. Mac常用基本命令/常用Git命令
  9. Python学习笔记——文件
  10. C Primer Plus学习笔记(二)
  11. Spring学习笔记(二)
  12. AFNetworking 使用 核心代码
  13. Linux Framebuffer驱动剖析之二—驱动框架、接口实现和使用
  14. 完整的WebRTC调用序列图
  15. javascript面向对象精要第二章函数整理精要
  16. 第一次安卓android studio安装,常见问题。
  17. 凭据管理 API
  18. [C# 开发技巧]如何防止程序多次运行
  19. U盘装win7系统
  20. 在windows下nginx+django+flup python3

热门文章

  1. 洛谷P1230智力大冲浪 题解
  2. spark基础知识三
  3. git中ignore文件配置
  4. 下载mqtt.fx
  5. node.js 路由详解
  6. 福州大学软件工程1916|W班 第10、11次作业成绩排名
  7. 【RS】AutoRec: Autoencoders Meet Collaborative Filtering - AutoRec:当自编码器遇上协同过滤
  8. selenium爬虫入门(selenium+Java+chrome)
  9. 左倾红黑树——左倾2-3树(不是jdk1.8的TreeMap的红黑树)
  10. TPad需求和迭代