【问题标题】: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() 打印给定范围内的局部变量。