news 2026/4/26 7:04:34

Python eval()和exec()函数使用详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python eval()和exec()函数使用详解

eval()和exec()的用法

eval() 函数的语法格式为:

1

eval(expression,globals=None,locals=None,/)

而 exec() 函数的语法格式如下:

1

exec(expression,globals=None,locals=None,/)

可以看到,二者的语法格式除了函数名,其他都相同,其中各个参数的具体含义如下:

1、expression:这个参数是一个字符串,代表要执行的语句 。该语句受后面两个字典类型参数 globals 和 locals 的限制,只有在 globals 字典和 locals 字典作用域内的函数和变量才能被执行。
2、globals:这个参数管控的是一个全局的命名空间,即 expression 可以使用全局命名空间中的函数。如果只是提供了 globals 参数,而没有提供自定义的builtins,则系统会将当前环境中的builtins复制到自己提供的 globals 中,然后才会进行计算;如果连 globals 这个参数都没有被提供,则使用 Python 的全局命名空间。
3、locals:这个参数管控的是一个局部的命名空间,和 globals 类似,当它和 globals 中有重复或冲突时,以 locals 的为准。如果 locals 没有被提供,则默认为 globals。

它们的区别在于,eval() 执行完会返回结果,而 exec() 执行完不返回结果

eval() 和 exec() 函数的应用场景
在使用 Python 开发服务端程序时,这两个函数应用得非常广泛。例如,客户端向服务端发送一段字符串代码,服务端无需关心具体的内容,直接跳过 eval() 或 exec() 来执行,这样的设计会使服务端与客户端的耦合度更低,系统更易扩展。

TensorFlow 框架,就会发现该框架中的静态图就是类似这个原理实现的:

1

2

TensorFlow 中先将张量定义在一个静态图里,这就相当将键值对添加到字典里一样;

TensorFlow 中通过 session 和张量的 eval() 函数来进行具体值的运算,就当于使用 eval() 函数进行具体值的运算一样。

需要注意的是,在使用 eval() 或是 exec() 来处理请求代码时,函数 eval() 和 exec() 常常会被黑客利用,成为可以执行系统级命令的入口点,进而来攻击网站。解决方法是:通过设置其命名空间里的可执行函数,来限制 eval() 和 exec() 的执行范围。

python中的exec()函数和eval()函数

exec()函数

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

1

2

3

>>>exec("x=1")

>>> x

1

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

1

2

3

4

5

6

>>>abs(-1)

1

>>>exec("abs='xyz'")

>>>abs(-1)

File"<stdin>", line1,in<module>

TypeError:"str"objectisnotcallable

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

1

2

3

4

5

6

7

8

>>>abs(-1)

1

>>> scope={}

>>>exec("abs='xyz'", scope)

>>>abs(-1)

1

>>>scope['abs']

'xyz'

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

eval()函数

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

1

2

>>>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函数都是将用户提供的字符串作为代码执行,将无法控制代码的行为,会带来严重的安全隐患,使用的时候要慎重。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 6:45:10

20251219_105921_0基础如何转行学习网络安全?怎么开始?

网络安全学习全攻略&#xff1a;零基础到高薪&#xff0c;收藏这份攻防教程就够了 文章详细分析了网络安全的就业环境、学习路径和前期准备。就业方面&#xff0c;网络安全行业人才缺口大、薪资高&#xff0c;初级岗位年薪10-20万&#xff0c;高级可达百万。学习分为四个阶段&…

作者头像 李华
网站建设 2026/4/26 6:44:42

Qianfan-OCR多场景落地:支持A4扫描件/手机截图/证件照/低分辨率图像

Qianfan-OCR多场景落地&#xff1a;支持A4扫描件/手机截图/证件照/低分辨率图像 1. 项目概述 Qianfan-OCR是百度千帆推出的开源端到端文档智能多模态模型&#xff0c;基于4B参数的Qwen3-4B语言模型构建。这个多模态视觉语言模型(VLM)采用Apache 2.0协议开源&#xff0c;支持商…

作者头像 李华
网站建设 2026/4/26 6:44:00

Scikit-Optimize贝叶斯优化实战:SVM超参数调优指南

1. 机器学习超参数优化与Scikit-Optimize实战指南在机器学习项目中&#xff0c;模型性能往往取决于超参数的选择。传统网格搜索和随机搜索虽然简单直接&#xff0c;但在高维参数空间中效率低下。Scikit-Optimize&#xff08;skopt&#xff09;作为Python生态中的贝叶斯优化工具…

作者头像 李华
网站建设 2026/4/26 6:42:58

动态感知与技能编排:构建实时智能交互系统的架构实践

1. 项目概述&#xff1a;从“技能”到“动态感知”的工程实践最近在开源社区里看到一个挺有意思的项目&#xff0c;叫vibe-motion/skills。光看这个名字&#xff0c;你可能会有点摸不着头脑——“vibe-motion”听起来像是某种动态或氛围感知技术&#xff0c;而“skills”又指向…

作者头像 李华
网站建设 2026/4/26 6:42:57

Claude Code Agents:基于智能体编排的AI开发团队实战指南

1. 项目概述&#xff1a;Claude Code Agents 是什么&#xff0c;以及它如何重塑开发工作流如果你是一名开发者&#xff0c;无论是独立作战还是身处团队&#xff0c;每天大概都会在几个熟悉的场景里反复横跳&#xff1a;打开 Stack Overflow 或官方文档&#xff0c;搜索某个框架…

作者头像 李华