函数内部的变量,在函数外部是无法获取并且修改的。
def f():
n = 1
n = n + 1 # 我们打算让每执行一次,n+1
return n
>>> f = f()
>>> f
2
>>> f
2
>>> f
2
# 每次执行函数,变量都被重新设置,并没有实现我们要的效果
为了实现我们想要的效果,我们需要引入闭包机制
。在函数的内部,我们在构建一个子函数去影响父函数变量的值,这样的行为,就是闭包。
def f():
n = 0
def add(): # 子函数,每次给父函数 +1 | 闭包
nonlocal n
n = n + 1
print(n)
return add
>>> add = f()
>>> add() # 我们每次执行的其实是 add 这个子函数,通过这种方式,我们保存了父函数 f 里面 n 的值
1
>>> add()
2
>>> add()
3
nonlocal
是 Python3 新增的作用域关键词。Python对闭包的支持一直不是很完美,在 Python2 中,闭包函数
可以读取到父级函数
的变量,但是无法修改变量的值,为此,我们经常要把变量声明为global
全局变量,这样就打破了闭包的性质。
为了解决这个问题,Python3 引入了nonlocal
,如上例代码,我们使用声明了nonlocal n
之后,就可以正常操作。