>> A="{'..._求字典里value值的和">
赞
踩
eval:eval() 函数用来执行一个字符串表达式,并返回表达式的原始值。
例如:有个字符串 A="{'value': 'hello'}"
想要输出该字符串的value值,应该怎么办。
如果仅仅是一个字典的话直接取dict['key']就可以轻松取出来,但是在字符串中我们就必须想办法把字符串转化成字典。这时候eval函数就该闪亮登场了。
代码如下:
>>> A="{'value': 'hello'}"
>>> B=eval(A)
>>> B
{'value': 'hello'}
此时在字典情况下想取出值就轻而易举了!
>>> B['value']
eval
功能:将字符串str当成有效的表达式来求值并返回计算结果。
语法: eval(source[, globals[, locals]]) -> value
参数:
source:一个Python表达式或函数compile()返回的代码对象
globals:可选。必须是dictionary
locals:可选。任意map对象
实例展示:
- 可以把list,tuple,dict和string相互转化。
- #################################################
- 字符串转换成列表
- >>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
- >>>type(a)
- <type 'str'>
- >>> b = eval(a)
- >>> print b
- [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
- >>> type(b)
- <type 'list'>
- #################################################
- 字符串转换成字典
- >>> a = "{1: 'a', 2: 'b'}"
- >>> type(a)
- <type 'str'>
- >>> b = eval(a)
- >>> print b
- {1: 'a', 2: 'b'}
- >>> type(b)
- <type 'dict'>
- #################################################
- 字符串转换成元组
- >>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
- >>> type(a)
- <type 'str'>
- >>> b = eval(a)
- >>> print b
- ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
- >>> type(b)
- <type 'tuple'>
eval()使用原因:
1)在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以,意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。
2)在machin learning里根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。
example:
- a=1
- g={'a':20}
- eval("a+1",g)
返回21
- #test eval() and locals()
- x = 1
- y = 1
- num1 = eval("x+y")
- print (num1)
-
- def g():
- x = 2
- y = 2
- num3 = eval("x+y")
- print (num3)
- num2 = eval("x+y",globals())
- #num2 = eval("x+y",globals(),locals())
- print (num2)
-
- g()
-
- print locals()["x"]
- print locals()["y"]
- print globals()["x"]
- print globals()["y"]
num1的值是2;num3的值也很好理解,是4;num2的值呢?由于提供了globals()参数,那么首先应当找全局的x和y值,也就是都为1,那么显而易见,num2的值也是2。如果注释掉该句,执行下面一句呢?根据第3)点可知,结果为4
locals()对象的值不能修改,globals()对象的值可以修改
-
- #test globals() and locals()
-
- z=0
- def f():
- z = 1
- print (locals())
- locals()["z"] = 2
- print (locals())
- f()
- globals()["z"] = 2
- print (z)
可以得出,两个print (locals())的结果是一样的,说明没有修改成功。而print (z)的值是2,说明修改成功了
eval有安全性问题,比如用户恶意输入就会获得当前目录文件
- eval("__import__('os').system('dir')")
- >>> import os
- >>> 'os' in globals()
- True
- >>> os.system('whoami')
- ap\zhail
- 0
怎么避免安全问题?
1、自行写检查函数;
2、使用ast.literal_eval
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。