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

     
  • 相关阅读:
    HDU 4745 Two Rabbits (区间DP)
    HDU 1007 Quoit Design最近点对( 分治法)
    acdream 小晴天老师系列——我有一个数列! (ST算法)
    HDU 3592 World Exhibition (差分约束,spfa,水)
    HDU 5501 The Highest Mark (贪心+DP,经典)
    HDU 5500 Reorder the Books (水题)
    HYSBZ 1010 玩具装箱toy (决策单调DP)
    POJ 3017 Cut the Sequence (单调队列优化DP)
    Vijos P1243 生产产品 (单调队列优化DP)
    PIVOT&UNPIVOT
  • 原文地址:https://www.cnblogs.com/lucky-heng/p/10161190.html
Copyright © 2011-2022 走看看