别院牧志知识库 别院牧志知识库
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 辨析

    • Python 中 exec()和 eval()的区别
      • exec 方法
      • eval()方法
      • Using python's eval() vs. ast.literal_eval()? - Stack Overflow
      • 参考来源
      • TODO
    • Ptyhon 中使用 is None 而不是 ==None 问题
  • Sockets编程

  • Django

  • stackoverflow

  • Flask

  • 全栈之路

  • 面试

  • 代码片段

  • 异步编程

  • 😎Awesome资源

  • PEP

  • Python工匠系列

  • 高阶知识点

  • Python 学习资源待整理
  • 设计模式

  • 好“艹蛋”的 Python 呀!
  • FIFO | 待学清单📝
  • pip 安装及使用
  • 数据分析

  • 源码阅读计划

  • OOP

  • 关于 python 中的 setup.py
  • 并行分布式框架 Celery
  • 七种武器,让你的代码提高可维护性
  • 使用 pdb 调试 Python 代码
  • 每周一个 Python 标准库
  • 🐍Python
  • 辨析
佚名
2017-11-17
目录

Python 中 exec()和 eval()的区别

Python 动态执行字符串代码片段(也可以是文件), 一般会用到 exec,eval。那么这两个方法有什么区别呢?

# exec 方法

注意:exec 是一个语法声明,不是一个函数。也就是说和if、for一样。它的作用是可以支持 Python 代码的动态执行。

官方文档对于 exec 的解释

This statement supports dynamic execution of Python code.

exec 后面跟的第一个表达式可以是:

  1. 代码字符串
  2. 文件对象
  3. 代码对象
  4. tuple

前面三种情况差不多,第四种比较特殊最后讲。

如果忽略后面的可选表达式,exec 后面代码将在当前域执行

>>> a=2
>>> exec "a=1"
>>> a
1

1
2
3
4
5

如果在表达式之后使用 in 选项指定一个dict,它将作为global和local变量作用域

>>> a=10 
>>> b=20 
>>> g={'a':6,'b':8} 
>>> exec "global a;print a,b" in g 
6 8 
1
2
3
4
5

如果in后详指定两个表达式,它们将分别用作global和local变量作用域

>>> a=10 
>>> b=20 
>>> c=20 
>>> g={'a':6,'b':8} 
>>> l={'b':9,'c':10} 
>>> exec "global a;print a,b,c" in g,l 
6 9 10
1
2
3
4
5
6
7

现在说下tuple的情况,这也是导致很多人误以为exec是一个函数的原因。

如果第一个表达式是tuple

exec(expr, globals) #它等效于 `exec expr in globals`

exec(expr, globals, locals) #它等效于  `exec expr in globals,locals`
1
2
3

# eval()方法

eval通常用来执行一个字符串表达式,并返回表达式的值。

eval(expression[, globals[, locals]])
1

有三个参数,表达式字符串,globals 变量作用域,locals 变量作用域。 其中第二个和第三个参数是可选的。

如果忽略后面两个参数,则eval在当前作用域执行。

>>> a=1 
>>> eval("a+1") 
2
1
2
3

如果指定 globals 参数

>>> a=1 
>>> g={'a':10} 
>>> eval("a+1",g) 
11
1
2
3
4

如果指定locals参数

>>> a=10 
>>> b=20 
>>> c=20 
>>> g={'a':6,'b':8} 
>>> l={'b':9,'c':10} 
>>> eval("a+b+c",g,l) 
25
1
2
3
4
5
6
7

如果要严格限制eval执行,可以设置globals为__builtins__,这样 这个表达式只可以访问__builtin__ module。

# coding=utf-8
exec 'print("hello")'   #支持str的表达式动态代码执行    >>hello
exec ('a = 3*4')
print a     # >>12
b = eval('3*4')     #不支持表达式 有返回值
print b     # >>12
1
2
3
4
5
6

# Using python's eval() vs. ast.literal_eval()? - Stack Overflow (opens new window)

如果我们不信任用户输入,大多数时候可以使用ast.literal_eval()替代eval。

# 参考来源

python 的 exec、eval 详解 - 疯狂奔跑的猪 (opens new window)

# TODO

Python 中的 eval()、exec()及其相关函数 - 云游道士 - 博客园 (opens new window) 深度辨析 Python 的 eval() 与 exec() (opens new window) python - What's the difference between eval, exec, and compile? - StackOverflow (opens new window)

编辑 (opens new window)
#Python#动态执行#exec#TODO
上次更新: 2024-07-15, 08:03:22
Ptyhon 中使用 is None 而不是 ==None 问题

Ptyhon 中使用 is None 而不是 ==None 问题→

最近更新
01
提升沟通亲和力的实用策略
03-26
02
工作
07-15
03
如何选房子
06-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 IMOYAO | 别院牧志
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式