为什么非本地关键字被全局关键字“打断”?

时间:2019-04-12 09:17:28

标签: python scope

我是一个尝试学习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()

1 个答案:

答案 0 :(得分:0)

涉及nonlocal关键字的表达式将使Python尝试在封闭的局部范围内查找变量,直到它首先遇到第一个指定的变量 name

如果nonlocal globe函数中有一个名为globe的变量,则intermediate表达式将具有外观。但是它将在global范围内遇到它,因此它将假定它已到达模块范围并完成搜索而没有找到nonclocal,因此是一个例外。

通过在global globe函数中声明intermediate,您几乎封闭了在先前作用域中使用相同名称的任何nonlocal变量的路径。您可以查看讨论here的原因,为什么要“决定”以这种方式在Python中实现。

如果您要确保变量globe是否在某个函数的本地范围内,则可以使用dir()函数,因为来自Python docs

  

不带参数,返回当前本地名称列表   范围。使用一个参数尝试返回有效属性的列表   该对象。