Python eval 函数

栏目: Python · 发布时间: 6年前

内容简介:在输出结果:

eval() 函数用来执行一个字符串表达式,并返回表达式的值。

eval(expression[, globals[, locals]])
expression
globals
locals
>>>x = 7
>>>eval( '3 * x' )
21
>>>eval('pow(2,2)')
4
>>>n=81
>>>eval("n + 4")
85

默认作用域

globalslocals 两个参数省略的情况下, eval() 函数在当前的作用域执行:

x = 100
y = 200


def compute():
    x = 10
    y = 20
    print(eval("x + y"))


compute()

输出结果:

30

globals 作用域

Python 的全局名字空间存储在一个叫 globals() 的字典对象中;局部名字空间存储在一个叫 locals() 的字典对象中。我们可以用 print () 来查看该函数体内的所有变量名和变量值。

x = 100
y = 200


def compute():
    x = 10
    y = 20
    print(globals())
    print(locals())


compute()

输出结果:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000024AC58C7710>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/Code/draw.py', '__cached__': None, 'x': 100, 'y': 200, 'compute': <function compute at 0x0000024AC587C268>}
{'x': 10, 'y': 20}

从结果可以看到, globals() 的结果包含了全局变量 'x': 100, 'y': 200 ,而 locals() 则包含的是局部变量 'x': 10, 'y': 20 。eval 函数包含 globals 参数则会使用全局作用域下的变量。

x = 100
y = 200


def compute():
    x = 10
    y = 20
    print(eval("x + y", globals()))

    
compute()

输出结果:

300

locals 作用域

如果同时包含 globalslocals 参数,则会优先在本地作用域查找,如果本地作用域没有,才会查找全局作用域。

x = 100


def compute():
    y = 20
    print(eval("x + y", globals(), locals()))


compute()

输出结果:

120

字符串转换

字符串转换成列表

s = "[[1,2], [3,4], [5,6]]"
print(type(s))
lst = eval(s)
print(type(lst))
print(lst)

输出结果:

<class 'str'>
<class 'list'>
[[1, 2], [3, 4], [5, 6]]

字符串转换成字典

s = "{'math': 90, 'chinese': 100}"
print(type(s))
dic = eval(s)
print(type(dic))
print(dic)

输出结果:

<class 'str'>
<class 'dict'>
{'math': 90, 'chinese': 100}

字符串转换成元组

s = "([1,2], [3,4], [5,6])"
print(type(s))
tup = eval(s)
print(type(tup))
print(tup)

输出结果:

<class 'str'>
<class 'tuple'>
([1, 2], [3, 4], [5, 6])

需要注意的地方

eval() 函数有安全性问题,比如用户恶意输入就会获得当前目录文件。

eval("__import__('os').system('dir')")

甚至查看目录下的所有文件的内容:

eval(open(‘filename’).read())

怎么避免安全问题?


以上所述就是小编给大家介绍的《Python eval 函数》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

未来是湿的

未来是湿的

[美] 克莱·舍基 / 胡泳、沈满琳 / 中国人民大学出版社 / 2009-5 / 39.80

一位妇女丢掉了手机,但征召了一群志愿者将其从盗窃者手中夺回。一个旅客在乘坐飞机时领受恶劣服务,她通过自己的博客发动了一场全民运动。在伦敦地铁爆炸案和印度洋海啸中,公民们用可拍照手机提供了比摄影记者更完备的记录。世界上最大的百科全书是由管理甚少的参与者们撰写的…… 不论在何处,你都能看见人们走到一起彼此分享,共同工作,或是发起某种公共行动。一部集众人之力的百科全书、一个丢失手机的传奇,这些事情......一起来看看 《未来是湿的》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具