【发布时间】:2017-04-03 21:26:11
【问题描述】:
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 文档状态:“表达式参数被解析并评估为 Python 表达式(从技术上讲,是条件列表),使用全局变量和局部变量字典作为全局和本地命名空间。"
全局和局部命名空间是否只适用于 eval 中可以解析的内容?函数调用 sub1() 是在 sub1() 函数的命名空间中求值的,而不管传递给 eval 的是全局还是局部?
【问题讨论】:
-
所以您期望
sub中的nonlocal指的是two的本地范围,而不是one的本地范围?sub的闭包在传递给eval之前已经设置为包含1。