zoukankan      html  css  js  c++  java
  • python中的exec()函数和eval()函数

    exec()函数

    exec函数用于执行存储在字符串中的python语句

    >>> exec("x=1")
    >>> x
    1

    但有时候,直接这样执行可能会污染我们的命名空间,比如下面的例子,我们使用python内置的abs函数求绝对值。

    >>> abs(-1)
    1
    >>> exec("abs='xyz'")
    >>> abs(-1)
      File "<stdin>", line 1, in <module>
    TypeError: "str" object is not callable

    在执行abs函数时报错了,类型错误,字符串类型对象不能被调用,原因就在于我们使用exec函数将字符串xyz赋值给了abs,abs此时已经不再表示求绝对值的函数了。为了防止出现这种情况,我们在调用exec函数时,可以给它传递第二个参数——命名空间,即就是一个字典。

    >>> abs(-1)
    1
    >>> scope = {}
    >>> exec("abs='xyz'", scope)
    >>> abs(-1)
    1
    >>>scope['abs']
    'xyz'

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

    eval()函数

    eval用于执行存储在字符串中的python表达式

    >>> eval("1+2+3+4+5")
    15

    与exec函数一样,我们也可以给eval函数提供命名空间。

    总结

    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函数都是将用户提供的字符串作为代码执行,将无法控制代码的行为,会带来严重的安全隐患,使用的时候要慎重。

     
  • 相关阅读:
    FJNU 1151 Fat Brother And Geometry(胖哥与几何)
    FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术)
    FJNU 1159 Fat Brother’s new way(胖哥的新姿势)
    HDU 3549 Flow Problem(最大流)
    HDU 1005 Number Sequence(数列)
    Tickets(基础DP)
    免费馅饼(基础DP)
    Super Jumping! Jumping! Jumping!(基础DP)
    Ignatius and the Princess IV(基础DP)
    Keywords Search(AC自动机)
  • 原文地址:https://www.cnblogs.com/lucky-heng/p/10161190.html
Copyright © 2011-2022 走看看