嵌套函数中引用的变量问题

时间:2017-09-07 09:27:43

标签: python-2.7 variables nested-function pythoninterpreter

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

const sortedData = sortingArray.map(id => data.find(val => val.id === id))

这两者之间的区别只是我试图改变变量的值。

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

当我运行b()时,我收回错误" UnboundLocalError:local variable' abc'在分配之前引用"

是什么原因?

1 个答案:

答案 0 :(得分:0)

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

根据Python documentation

  

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

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

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()在给定范围内打印局部变量。