首页 > 代码库 > Python 闭包

Python 闭包

闭包

1、注意:返回的函数内部不要使用后续会发生变化的变量。

def f():
    gs = []
    for k in range(1, 4):
        def g(i):
            return i + k
        gs.append(g)
    return gs

例如这段代码感觉上应该返回三个函数分别return i+1、return i+2、return i+3(i为新函数参数),但事实却是得到了三个return i+3。

>>> from test import f
>>> g1, g2, g3 = f()
>>> g1(0)
3
>>> g2(0)
3
>>> g3(0)
3

 

2、如果一定要得到return i+1、return i+2、return i+3这三个函数怎么办?
可以这样

def f():
    gs = []
    gs.append(lambda x : x + 1)
    gs.append(lambda x : x + 2)
    gs.append(lambda x : x + 3)
    return gs

但是要得到return i + 1 ~ return i + 100就行不通了,这时候可以

def f():
    hs = []
    def g(i):
        def h(j):
            return j + i
        return h
    for k in range(1, 3):
        hs.append(g(k))
    return hs

这段代码可以这样看:f()最终返回一个函数list->hs,那么hs需要append什么呢?append n个reuturn i+n函数。这些函数又怎么得到呢?利用内部的函数返回得到。更清晰的版本:

def f():
    # 返回函数的函数
    def g(i):
        return lambda j : i + j
    # 获取元素为函数的list
    hs = []
    for k in range(1, 5):
        hs.append(g(k))
    return hs

 

匿名函数=lambda

Python 闭包