python eval函数

 eval() 方法的语法:  eval(expression[, globals[, locals]])
参数

  • expression -- 表达式。
  • globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
  • locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

用法示例:

将字符串对应的名字的变量转换成该变量对应的值:
eval 方法能使字符串本身的引号去掉,保留字符的原本属性

 

x='7'
print(type(x),x)  #<class 'str'> 7
a=eval(x)
print(type(a),a)  <class 'int'> 7
b=a'      等价于b='7'
c=eval(b)
print(type(c),c)    <class 'int'> 7

eval() 函数也可以直接用来提取用户输入的多个值

a,b=eval(input())
print(a,b)

 

 

python查找变量的顺序:局部--> 全局--> 内置

 三个参数的使用:

1、在前两个参数省略的情况下,eval在当前的作用域执行:

a=10;
print(eval("a+1"))   执行结果为:11

在这种情况下,后两个参数省略了,所以eval中的a是前面的10。对于eval,它会将第一个expression字符串参数的引号去掉,然后对引号中的式子进行解析和计算。

 

2、在globals指定的情况下:

a=10;
g={':4}
",g)) 执行结果为:5

这里面可能有点绕啊,初学者得理理清楚。在这次的代码中,我们在 eval中提供了globals参数,这时候eval的作用域就是g指定的这个字典了,也就是外面的a=10被屏蔽掉了,eval是看不见的,所以使用了a为4的值。

 

3、在 locals指定的情况下 :

a=10
b=20
c=30
g={':6,b':8}
t={':100,1)">c':10} 
a+b+c',g,t))  执行的结果为:116

 这里面就更有点绕人了,此次执行的结果中,a是6,b是100,c是10。我们首先来看一下,对于a为6我们是没有疑问的,因为在上个例子中已经说了,g会屏蔽程序中的全局变量的,而这里最主要的是为什么b是100呢?还记得我们在参数介绍的时候说过,当locals和globals起冲突时,locals是起决定作用的,这在很多编程语言里都是一样的,是作用域的覆盖问题,当前指定的小的作用域会覆盖以前大的作用域,这可以理解为一张小的纸盖在了一张大的纸上,纸是透明的,上面写的东西是不透明的,而它们重合的地方就可以理解成两个作用域冲突的地方,自然是小的显现出来了。

 

eval()的用法:

可以把list,tuple,dict和string相互转化。例子:

字符串转数字
a = 2'
b = 3
c = eval(a + b)   先拼接为字符串
<class 'int'> 23

字符串转列表
a = [[1,2],[3,4],[5,6],[7,8],[9,0]]"
b = eval(a)
print(type(b),b)  <class 'list'> [[1,0]]

字符串转字典
a = {1: 'a',2: 'b'}<class 'dict'> {1: 'a',2: 'b'}

字符串转元组
a = ([1,(9,0))<class 'tuple'> ([1,0))

 

需要注意的是,eval()函数的安全性问题

想一想这种使用环境:需要用户输入一个表达式,并求值。

如果用户恶意输入,例如:

>>>a = input("请输入:")
>>>__import__("os").getcwd()
>>>eval(a)   # 那么eval()之后,你会发现,当前目录文件都会展现在用户前面。

C:\Python27 # 输出结果是保存代码的文件夹路径

那么继续输入:

open('文件名').read()

代码都给人看了。获取完毕,一条删除命令,文件消失。

相关文章

本文从多个角度分析了vi编辑器保存退出命令。我们介绍了保存...
Python中的回车和换行是计算机中文本处理中的两个重要概念,...
SQL Server启动不了错误1067是一种比较常见的故障,主要原因...
信息模块是一种可重复使用的、可编程的、可扩展的、可维护的...
本文从电脑配置、PyCharm版本、Java版本、配置文件以及程序冲...
本文主要从多个角度分析了安装SQL Server 2012时可能出现的错...