【问题标题】:The Problem of variable referenced in the nested function嵌套函数中引用变量的问题
【发布时间】:2017-09-07 09:27:43
【问题描述】:

有两个简单的函数拥有嵌套函数,如下:

def a():
    abc = 1
    def write():
        print abc
    write()

def b():
    abc = 1
    def write():
        print abc
        abc += 1
    write()

这两个的区别只是我试图改变变量的值。

当我运行 a() 时,没关系。

当我运行 b() 时,我返回错误 "UnboundLocalError: local variable 'abc' referenced before assignment"

是什么原因?

【问题讨论】:

    标签: python-2.7 variables nested-function pythoninterpreter


    【解决方案1】:

    您遇到的问题是在变量范围内。程序中的嵌套函数有自己的本地命名空间/范围,不同于调用它们的外部函数。

    根据Python documentation

    如果一个名字被声明为全局的,那么所有的引用和赋值都会去 直接指向包含模块全局名称的中间范围。 否则,在最内层范围之外找到的所有变量都是 只读(尝试写入此类变量只会创建一个 最内层范围内的新局部变量,保持相同 命名外部变量不变)。

    意思是如果你改为尝试这个:

    def b():
        abc = 1
        global abc
        print abc
        def write():
            global abc
            abc += 1
            print abc
        write()
        print abc
    

    您的函数b 将正常运行。这也意味着abc的值会全局增加,在调用write()后变成2

    如果您不将abc 变量声明为global,则对于嵌套函数write(),它将是只读的。 write() 将无法更改它,但它可以打印它,或者在本地重新分配它。以下方法也有效,因为它首先将 abc 的值重新分配给另一个局部变量,然后更改该变量,

    def a():
        abc = 1
        def write():
            print abc
            abc2 = abc
            abc2 += 1
            print abc2
        write()
    

    您可以使用print locals() 打印给定范围内的局部变量。

    【讨论】:

    • 很高兴为您提供帮助!这很有趣。
    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 2018-07-16
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多