python闭包

闭包, 仅讨论传统的函数意义上的闭包

闭包

返回一个函数

有时我们会遇到这样一个情况, 函数的返回值是个函数

还要使用其外侧函数的局部变量

返回的函数还要使用其外侧函数的变量, 一般来说, 如果一个函数结束,函数的内部所有东西都会释放掉,这时有个问题, 如果是这样工作的, 调用返回的函数时怎么办?
事实上, python确实是这样工作的, 只是对这种情况做特殊处理(还可能是可变变量允许它调用), 这种情况我们叫做闭包.

如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。

这也是装饰器的基础

拿到的变量只有一份

如果我们写了一个函数, 那每次调用这个函数时, 函数内的局部变量都会在每次调用时重置.
而闭包不是这样, 函数能调用多次, 外侧函数结束时交给它的局部变量只有一份, 每次调用这个变量不会充值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def f1():
t = 0
start = time.time()
def spend():
nonlocal t
t = t + time.time()-start
print(t)
return spend

t = f1()
t()
time.sleep(2)
t()
time.sleep(2)
t()

调用时才会执行

如果返回了多个待调用的函数, 而这些函数中使用了上述的变量, 那就会出现问题, 原因就是使用的外侧函数的变量只有一份

1
2
3
4
5
6
7
8
9
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs

f1, f2, f3 = count()

解决办法:

  • 不写这样的东西
  • 让这样的函数在内部被调用, 返回一个新的函数, 这个新的函数返回真正工作的函数的结果
文章作者: Shoor
文章链接: https://shoorday.github.io/posts/c951a1d4/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Shoor's Blog