def one():
var1 = 1
def sub():
nonlocal var1
var1 += 1
return var1
return sub
def two():
var1 = 5
sub1 = one()
return eval('sub1()', globals(), locals())
if __name__ == "__main__":
print(two())Python 3.6.1文档声明:“使用全局和局部字典作为全局和局部名称空间,将表达式参数作为Python表达式(从技术上讲,是条件列表)进行解析和计算。”
全局和本地名称空间是否仅适用于eval中可以解析的名称空间?调用sub1()的函数在sub1()函数的名称空间中求值,而不管传递给eval的是全局的还是局部的?
发布于 2017-04-04 05:41:04
是的,全局和本地名称空间几乎只适用于那些可以在eval中解析的名称空间。函数对象静态地绑定到它们的全局对象(模块!)当输入一个函数时,会创建一个新的本地名称空间。
发布于 2017-04-04 05:41:17
nonlocal引用函数定义的父作用域,而不是调用站点。将局部变量传递到eval中时,不会更改所调用函数中的局部变量,而是为要计算的代码片段设置局部变量。因此,编写eval('sub1()', globals(), locals()等同于编写sub1(),因为无论哪种方式,相同的局部变量都在作用域中-如果是您编写的,sub1不会返回6,不是吗?
https://stackoverflow.com/questions/43194578
复制相似问题