0

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

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”

是什么原因?

4

1 回答 1

0

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

根据Python 文档

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

这意味着如果你改为尝试这个:

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

您的函数b将运行没有错误。这也意味着 的值abc将在全局范围内增加并2在调用后变为write()

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

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

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

于 2017-09-08T03:57:12.380 回答