exec()

exec函数用于执行存储在字符串中的python,是没有返回值的

  1. exec("a=333")
  2. print(a)

但是有时候直接使用会污染命名空间

  1. exec("abs=xuz")
  2. print(abs(555))

执行上面的代码会报错

  1. Traceback (most recent call last):
  2. File "D:/pythontest/test.py", line 160, in <module>
  3. print(abs(555))
  4. TypeError: 'str' object is not callable

字符串类型对象不能被调用。使用exec函数将字符串xuz赋值给了abs,abs此时就不载表示求绝对值的函数了。
为了防止出现这种情况,在调用exec函数的时候,可以给它传递第二个参数—-命名空间,即一个字典。

  1. scope={}
  2. exec("abs='xuz'",scope)
  3. print(abs(555))
  4. print(scope['abs'])

通过执行赋值语句,创建的变量就位于scope中,不会污染命名空间。

eval()

eval函数用于执行存储在字符串中的表达式,是有返回值的

  1. print(eval("1+2+3+4+5"))
  2. 15

总结

1、exec函数执行的是python语句,没有返回值,eval函数执行的是python表达式,有返回值;
2、exec函数和eval函数都可以传入命名空间作为参数,实际上,可以向exec函数和eval函数提供两个命名空间,他们的函数定义为:
exec(source, globals=None, locals=None)
eval(source, globals=None, locals=None)
其中globals和locals都是可选参数,globals表示全局命名空间,必须是字典,locals表示局部命名空间,可以是任何映射。
3、需要注意的是,exec函数和eval函数都是将用户提供的字符串作为代码执行,将无法控制代码的行为,会带来严重的安全隐患,使用的时候要慎重。