在Python 2.x中,闭包只能读外部函数的变量,而不能改写它。
举例来说,这样是合法的:
def a():
x = 0
def b():
print locals()
y = x + 1
print locals()
print x, y
return b
a()()
而这样是非法的:
def a():
x = 0
def b():
print locals()
y = x + 1
print locals()
x = 1
print x, y
return b
a()()
为了解决这个问题,Python 3.x引入了nonlocal关键字
只要在闭包内用nonlocal声明变量,就可以让解释器在外层函数中查找变量名了,例如:
def a():
x = 0
def b():
nonlocal x
x += 1
print x
return b
a()()