有两个简单的函数拥有嵌套函数,如下所示:
const sortedData = sortingArray.map(id => data.find(val => val.id === id))
这两者之间的区别只是我试图改变变量的值。
当我运行()时,那没关系。
当我运行b()时,我收回错误" UnboundLocalError:local variable' abc'在分配之前引用"
是什么原因?
答案 0 :(得分:0)
您遇到的问题是变量范围。程序中的嵌套函数有自己的本地命名空间/范围与调用它们的外部函数不同。
如果名称被声明为全局,那么所有引用和分配都会进行 直接到包含模块全局名称的中间范围。 否则,在最内层范围之外找到的所有变量都是 只读(尝试写入这样的变量只会创建一个 最内层范围内的新局部变量,保持相同 命名外部变量不变)。
意思是如果你改为尝试这个:
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()
在给定范围内打印局部变量。