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())
我期待上面的代码打印6但它打印2. Python 3.6.1 docs声明:“表达式参数使用全局变量和局部变量进行解析并作为Python表达式进行评估(技术上讲,条件列表)字典作为全局和本地命名空间。“
全局和本地命名空间是否仅适用于可在eval中解析的内容?函数调用sub1()在sub1()函数的命名空间中进行计算,而不管传递给eval的全局或局部是什么?
答案 0 :(得分:1)
是的,全局和本地命名空间几乎只适用于那些可以在eval
中解析的命名空间。函数对象静态绑定到它们的全局对象(模块!),当输入函数时,会创建一个新的本地名称空间。
答案 1 :(得分:1)
nonlocal
是指函数定义的父作用域,而不是调用站点。当您将本地人传递到eval
时,您不会更改您调用的函数内的局部变量 - 您需要为您正在评估的代码段设置局部变量。因此编写eval('sub1()', globals(), locals()
等同于编写sub1()
,因为相同的局部变量都在范围内 - 如果你写了那么你也不会期望sub1返回6,对吗? / p>