Python 闭包

内部变量

函数内部的变量,在函数外部是无法获取并且修改的。

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

nonlocal是 Python3 新增的作用域关键词。Python对闭包的支持一直不是很完美,在 Python2 中,闭包函数可以读取到父级函数的变量,但是无法修改变量的值,为此,我们经常要把变量声明为global全局变量,这样就打破了闭包的性质。

为了解决这个问题,Python3 引入了nonlocal,如上例代码,我们使用声明了nonlocal n之后,就可以正常操作。

Python 教程 Python 入门 Python 时间 Python JSON