很多人学 Python 时都会在示例代码里见到 eval,一行 eval('1+2') 就跑出 3,看着挺神奇。它到底干了什么,什么时候能用,什么时候千万别碰,一次说明白。
eval('1+2*3') # 结果 7eval('len([1,2,3])') # 结果 3eval 是 Python 的内置函数,作用是把一个字符串当成表达式去执行,并返回结果。只要字符串内容是合法表达式,它都会当成代码来跑,算式、列表、元组都行。但最常见的误用是拿它做字符串转数字,纯数字其实用 int() 或 float() 就够了,int('123') 直接得整数,float('1.5') 得 1.5,不用绕这一圈。eval 只在你确实需要计算表达式时才用得上,比如输入 '2*(3+4)' 想直接得到 14。
几个报错也好认:表达式里引用了没定义的变量会抛 NameError,比如 eval('abc') 会把 abc 当变量名去找;字符串不是合法表达式就是 SyntaxError。正式代码里记得用 try/except 接住,别让程序直接崩。它还有第二、第三个参数,能传 globals 和 locals 字典限定表达式能访问的名字,日常很少用到,知道就行。
eval 的真实风险在哪
eval 会执行任何合法表达式,包括函数调用。把它直接套在用户输入上,比如写成 eval(input('请输入:')),别人输入一段调用系统命令的代码,它照单全收,等于在你机器上执行任意代码。网上不少入门示例这么写,照搬到正式项目里就是漏洞。
安全一点的替代写法
只是想把字符串还原成列表、字典、数字这类字面量,用 ast 模块的 literal_eval:
from ast import literal_eval
literal_eval('[1, 2, 3]') # 只认字面量,不执行调用遇到函数调用、变量引用这类内容,它会直接抛 ValueError 或 SyntaxError,不会执行,安全性高得多。
什么场景还能用
- 自己练手的小项目,比如写个简易计算器,输入来源就是自己
- 表达式完全由开发者写死在代码或配置里,不经过任何外部输入
一句话:eval在python中的用法就是「把字符串当代码跑」,功能强但口子大,能不用就不用,必须用时输入绝不能来自用户。