闭包:
- 是函数式编程的一个重要的语法结构,是一种特殊的内嵌函数。
- 如果在内部函数对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包。
- 通过闭包可以访问外层非全局作用域的变量,这个作用域称为闭包作用域。
一、函数实例:
1、在内嵌函数funY中引用外层函数funX的非全局变量。
def funX(x):
def funY(y):
return x * y
return funY
i = funX(8)
print(type(i)) # <class 'function'>
print(i(5)) # 40
2、通过上例,结合下例,我们可以发现闭包的返回值通常是函数。
def make_counter(init):
counter = [init]
def inc(): counter[0] += 1
def dec(): counter[0] -= 1
def get(): return counter[0]
def reset(): counter[0] = init
return inc, dec, get, reset
inc, dec, get, reset = make_counter(0)
inc()
inc()
inc()
print(get()) # 3
dec()
print(get()) # 2
reset()
print(get()) # 0
二、nonlocal
1、能改变外层参数的值
def outer():
num = '我是外层'
def inner():
nonlocal num # nonlocal关键字声明
num = '通过闭包nonlocal改变外层num'
print('内:'+num)
inner()
print('外:'+num)
outer()
# 内:通过闭包nonlocal改变外层num
# 外:通过闭包nonlocal改变外层num