我是一个尝试学习python的初学者,我遇到了范围问题。在执行最底层的代码时,我遇到了错误“未找到非本地var_name的绑定”。有人可以解释为什么非本地关键字无法“越过”中间函数进入外部函数吗?
#this works
globe = 5
def outer():
globe = 10
def intermediate():
def inner():
nonlocal globe
globe = 20
print(globe)
inner()
print(globe)
intermediate()
print(globe)
outer()
globe = 5
def outer():
globe = 10
def intermediate():
global globe #but not when I do this
globe = 15
def inner():
nonlocal globe #I want this globe to reference 10, the value in outer()
globe = 20
print(globe)
inner()
print(globe)
intermediate()
print(globe)
outer()
答案 0 :(得分:0)
涉及nonlocal
关键字的表达式将使Python尝试在封闭的局部范围内查找变量,直到它首先遇到第一个指定的变量 name 。
如果nonlocal globe
函数中有一个名为globe
的变量,则intermediate
表达式将具有外观。但是它将在global
范围内遇到它,因此它将假定它已到达模块范围并完成搜索而没有找到nonclocal
,因此是一个例外。
通过在global globe
函数中声明intermediate
,您几乎封闭了在先前作用域中使用相同名称的任何nonlocal
变量的路径。您可以查看讨论here的原因,为什么要“决定”以这种方式在Python中实现。
如果您要确保变量globe
是否在某个函数的本地范围内,则可以使用dir()
函数,因为来自Python docs:>
不带参数,返回当前本地名称列表 范围。使用一个参数尝试返回有效属性的列表 该对象。