繁体   English   中英

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

[英]Why is nonlocal keyword being 'interrupted' by a global keyword?

我是一个初学程序员,正在尝试学习python,我遇到了范围主题。 在执行最底层的代码时,我遇到了错误'找不到非本地var_name的绑定'。 有人可以解释为什么nonlocal关键字无法“超越”中间函数并进入外部函数?


#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()

涉及nonlocal关键字的表达式将导致Python尝试在封闭的本地范围中查找变量,直到它首次遇到第一个指定的变量

nonlocal globe表达式将查看intermediate函数中是否存在名为globe的变量。 然而,它会在global范围内遇到它,因此它会假定它已经达到模块范围并且在没有找到非nonclocal范围的情况下完成搜索它,因此是例外。

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

如果要确保变量globe是否在某个函数的局部范围内,可以使用dir()函数,因为来自Python文档

如果没有参数,则返回当前本地范围中的名称列表。 使用参数,尝试返回该对象的有效属性列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM