eval是python的一个内置函数,其作用是返回传入字符串的表达式的结果
- 语法:eval(expression[, globals[, locals]])
- expression: 这个参数是一个表达式
- globals: 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象
- locals: 变量作用域,局部命名空间,如果被提供,可以是任何映射对象
1. 只提供第一个参数,eval的作用就是将expression的引号去掉,保留引号中字符的原有属性
m = "123"
print(eval(m))
# 输出123
x = 3
print(eval("3 * x"))
print(eval("pow(2, x)"))
# 输出9 8
n = "ABC"
print(eval(n))
# NameError: name 'ABC' is not define
# 在这个程序中,eval会剥去变量n的引号,发现ABC不能像上一个程序一样计算
# eval就会认为ABC是一个变量名,并在当前作用域查找ABC变量
# 未能找到,报错
ABC = "DEF"
n = "ABC"
print(eval("n"))
print(eval(n))
# 第一个eval尝试剥去"n"的引号,n不能进行计算,于是认为n是一个变量,查找变量n并print(n)
# 第二个eval尝试剥去n的引号,ABC不能进行计算,于是认为ABC是一个变量,查找变量ABC并print(ABC)
# eval函数还能将形似列表的字符串变成真列表
m = "['123', '456', '789']"
print(type(m))
n = eval(m)
print(type(n))
print(n)
# 输出:
# <class 'str'>
# <class 'list'>
# ['123', '456', '789']
m = "[A, B, C]"
print(eval(m))
# 剥去m的引号发现是一个列表,列表中是一些变量,于是查找变量
# 未能找到,NameError: name "A' is not defined
A = 1
B = 2
C = 3
n = "['A', 'B', 'C']"
print(eval(n))
# 剥去n的引号发现是一个列表,列表中是一些变量,于是查找变量
# 全部找到,输出:[1, 2, 3]
2. 同时提供globals这个参数
A = 1
B = 2
C = 3
dic = {'A': 10, 'B': 20}
print(eval("A + B", dic))
# 输出30
# 相当于eval的作用域变成了dic这个字典,外面的A,B都看不到了
print(eval("A + B + C", dic))
# Namerror: name 'C' is not defined
# 找不到变量C
3. 同时提供locals这个参数
A = 1
B = 2
C = 3
dic1 = {'A': 10, 'B': 20}
dic2 = {'A': 100, 'C': 300}
print(eval("A + B + C", dic1, dic2))
# 输出420
# dic2的优先级高于dic1,先从dic2中查找变量,未找到的再从dic1中查找