# eval函数

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

# expression:这个参数是一个字符串,python会使用globals字典和locals字典作为全局和局部的命名空间,将expression当做一个python

# 表达式(从技术上讲,是一个条件列表)进行解析和计算。

# globals:这个参数管控的是一个全局的命名空间,也就是我们在计算表达式的时候可以使用全局的命名空间中的函数,如果这个参数被提供了,

# 并且没有提供自定义的__builtins__,那么会将当前环境中的__builtins__拷贝到自己提供的globals里,然后才会进行计算。

# 关于__builtins__,它是python的内建模块,也就是python自带的模块,不需要我们import就可以使用的,例如我们平时使用的int、

# str、abs等都在这个模块中。

# locals:这个参数管控的是一个局部的命名空间,和globals类似,不过当它和globals中有重复的部分时,locals里的定义会覆盖掉globals

# 中的,也就是当globals和locals中有冲突的部分时,locals说了算,它有决定权,以它的为准。如果locals没有被 提供的话,则默认为globals。

下面举一些简单的用例:

# 将字符串str当成有效的表达式来求值并返回计算
a = "3*2"
print(eval(a))  # 脱去外层"",当成表达式求值,此时返回6
a = 10
print(eval("a+1"))  # 返回11

# 切片取数
a = "1234"
print(eval(a[0]))  # 取字符串第0个元素,此时返回1
print(eval(a[2]))  # 返回3

# 在globals指定的情况下:
a = 10
g = {'a': 4}
print(eval("a + 1", g))  # 此时返回值为5,因为提供了globals参数,这时eval作用域就是g指定的字典,也就是说外面的a=10被屏蔽掉

# 在locals指定的情况下:
a = 10
b = 20
c = 30
g = {'a': 6, 'b': 8}
t = {'b': 100, 'c': 10}
print(eval('a+b+c', g, t))
# 此时返回值为116,g屏蔽掉全局变量a和b,locals又与globals起冲突,此时locals起决定作用,b值为t中的b值100

a = '["a", "b", "c"]'
print(eval(a))  # 返回['a', 'b', 'c']

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐