Python中的UnboundLocalError
这个问题在这里已经有了答案:
Python没有变量声明,所以它必须找出变量本身的范围。 它通过一个简单的规则来实现:如果函数内部有一个变量赋值,那么该变量被认为是局部的[1]。 因此,线
counter += 1
隐式地使counter
本地increment()
。 尽管如此,尝试执行这一行,会尝试在分配之前读取局部变量counter
的值,导致UnboundLocalError
。[2]
如果counter
是全局变量,则global
关键字将有所帮助。 如果increment()
是一个本地函数并counter
一个局部变量,那么可以在Python 3.x中使用nonlocal
。
您需要使用全局语句,以便修改全局变量计数器,而不是本地变量:
counter = 0
def increment():
global counter
counter += 1
increment()
如果定义的counter
的封闭范围不是全局范围,那么在Python 3.x中,可以使用非本地语句。 在Python 2.x的相同情况下,您将无法重新分配给非本地名称counter
,因此您需要使counter
变为可变并对其进行修改:
counter = [0]
def increment():
counter[0] += 1
increment()
print counter[0] # prints '1'
要回答你的主题中的问题,*是的,在Python中有闭包,除了它们只适用于函数内部,并且(在Python 2.x中)它们是只读的; 您不能将该名称重新绑定到不同的对象(但如果该对象是可变的,则可以修改其内容)。 在Python 3.x中,可以使用nonlocal
关键字来修改一个闭包变量。
def incrementer():
counter = 0
def increment():
nonlocal counter
counter += 1
return counter
return increment
increment = incrementer()
increment() # 1
increment() # 2
*原始问题的标题问到Python中的闭包。
链接地址: http://www.djcxy.com/p/23877.html上一篇: UnboundLocalError in Python
下一篇: How can I check the syntax of Python script without executing it?