刚好前些天有人提到eva l()与exec()这两个函数,所以就翻了下Python的文档。这里就来简单说一下这两个函数以及与它们相关的几个函数,如globals()、locals()和compile():
计算指定表达式的值。也就是说它要执行的Python代码只能是单个运算表达式(注意eva l不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似。
输出结果:
对输出结果的解释:
动态执行Python代码。也就是说exec可以执行复杂的Python代码,而不像eva l函数那么样只能计算一个表达式的值。
exec函数的返回值永远为None.
我们把实例1中的eva l函数换成exec函数试试:
输出结果:
因为我们说过了,exec函数的返回值永远为None。
输出结果:
对输出结果的解释:
前两个输出跟上面解释的eva l函数执行过程一样,不做过多解释。关于最后一个数字34,我们可以看出是:x = 1, y = 3是没有疑问的。关于z为什么还是30而不是4,这其实也很简单,我们只需要在理一下代码执行过程就可以了,其执行过程相当于:
先来看下这两个函数的定义和文档描述
描述: Return a dictionary representing the current global symbol table. This is always the dictionary of the current module (inside a function or method, this is the module where it is defined, not the module from which it is called).
翻译: 返回一个表示当前全局标识符表的字典。这永远是当前模块的字典(在一个函数或方法内部,这是指定义该函数或方法的模块,而不是调用该函数或方法的模块)
描述: Update and return a dictionary representing the current local symbol table. Free variables are returned by locals() when it is called in function blocks, but not in class blocks.
翻译: 更新并返回一个表示当前局部标识符表的字典。自由变量在函数内部被调用时,会被locals()函数返回;自由变量在类累不被调用时,不会被locals()函数返回。
输出结果:
输出结果:
上面打印出的G和L的内存地址是一样的,说明在模块级别locals()的返回值和globals()的返回值是相同的。
将source编译为code对象或AST对象。code对象能够通过exec()函数来执行或者通过eva l()函数进行计算求值。
输出结果:
comiple()函数、globals()函数、locals()函数的返回结果可以当作eva l()函数与exec()函数的参数使用。
另外,我们可以通过判断globals()函数的返回值中是否包含某个key来判断,某个全局变量是否已经存在(被定义)。