1. 程式人生 > >列表推導式與lambda的結合

列表推導式與lambda的結合

def fun():
    # return (lambda x: x * i for i in range(4))  # 結果是[0,2,4,6]
    return [lambda x: x * i for i in range(4)]

預期結果應該是[0,2,4,6],但確是[6, 6, 6, 6]
print([m(2) for m in fun()])

-----------------------------------------------------------------------------------------------------

可以把上述 匿名函式+列表推導式 轉換為下種格式,生成了4次6
li = []


def funcs():

    for i in range(4):

        def func(x):

            return x * i

        li.append(func)
    return li

for fun in funcs():
    print(fun(2))

funcs函式裡面形成了一個閉包
閉包的兩個特性:
  ①、內部函式使用外部函式的變數(不對外部函式的變數進行重新賦值)
  ②、外部函式 return 內部函式的函式名(其實是返回內部函式的記憶體地址)