python内置函数eval(),用来将一个字符串当作python表达式执行,并返回执行结果。比如:
>>> a = '[1,2,3,4,5,6]'
>>> a
'[1,2,3,4,5,6]'
>>> alist = eval(a)
>>> alist
[1, 2, 3, 4, 5, 6]
这段代码将一个字符串a,通过eval函数执行,就变成了一个list对象。
eval()函数很灵活,我们写的python代码,用引号括起来,都是字符串,理论上都可以通过eval()函数来执行。只是要理解什么时python表达式,赋值语句的右边都是表达式,或者说表达式中不能有等号(=),表达式不用用来创建变量,但是在eval中调用函数时,入参赋值时可以的。
>>> eval('a=1')
Traceback (most recent call last):
File "", line 1, in
File "", line 1
a=1
^
SyntaxError: invalid syntax
>>>
>>> def cc(a):
... print(a)
...
>>> cc(a=1)
1
>>> eval('cc(a=3)')
3
eval()函数还有两个参数,globals和locals,分别用来执行执行字符串中的变量的位置(是不是想到了python内置的globals()函数和locals()函数)。按照官方的解释,如果不提供globals和locals参数,默认eval执行代码的环境与其所在的位置的其它代码一样,即首先找locals,然后再找globals。
>>> a
'[1,2,3,4,5,6]'
>>> def tee():
... a = 567
... eval('print(a)')
...
>>> tee()
567
如果提供了globals参数,运行效果如下:
>>> def tee():
... a = 567
... eval('print(a)',globals())
...
>>> tee()
[1,2,3,4,5,6]
没有必要单独提供locals参数,这是默认的!
eval函数不能直接获取nonlocal变量的访问,只能通过其它代码来讲nonlocal变量引入当前local环境!
eval函数的使用要小心,因为它会把任意字符串当成python表达式来执行!如果字符串来自用户的输入,用户可能会输入恶意代码,比如删除文件等。
-- EOF --