Skip to content

闭包

1. 闭包

Python 中的闭包是指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。函数是不是匿名的没有关系,关键是它能访问定义体之外定义的非全局变量。

python
def make_averager():
    series = []

    def averager(new_value):
        series.append(new_value)
        total = sum(series)
        return total / len(series)

    return averager

2. 防止闭包副作用

在使用 Lambda 表达式时,如果使用了外部变量,那么在调用 Lambda 表达式时,外部变量的值会被保存,而不是在调用时获取。

python
def demo():
    funcs = [lambda x: x + n for n in range(5)]
    for f in funcs:
        print(f(0))

此时,输出结果为:

python
4
4
4
4
4

如果我们希望输出结果为 0 1 2 3 4,可以使用默认参数:

python
def demo():
    funcs = [lambda x, n=n: x + n for n in range(5)]
    for f in funcs:
        print(f(0))

也可以使用 functools.partial

python
from functools import partial

def demo():
    funcs = [partial(lambda n, x: x + n, n) for n in range(5)]
    for f in funcs:
        print(f(0))