Python 闭包,为每个嵌套函数创建具有不同 ID 的新 int

Python closures, create new int with different ID for every nested function

我刚学了闭包,我发现:

from threading import Thread
from time import sleep

def call(time,f):
    def caller():
        sleep(time)
        f()
    Thread(target=caller).start()

def func():
    for i in range(1,6):
        call(i,lambda: print(i))

func()

然后该代码在屏幕上写入了五个“5”。太棒了。我知道这是因为相同的内存地址。现在我想知道是否有任何好的 pythonic 方法可以使该函数写入 1、2、3、4、5 而不是 5、5、5、5、5。例如,您可以在 js 中使用 let 关键字来完成。

问题是您并没有真正创建一个闭包,您只是每次都给它相同的 lambda。

您可以 return 绑定 i 值的函数:

from threading import Thread
from time import sleep

def call(time,f):
    def caller():
        sleep(time)
        f()
    Thread(target=caller).start()

def bind(i):
    return lambda: print(i)

def func():
    for i in range(1,6):
        call(i, bind(i))

func()

bind return 是一个函数,其中 i 的值为 "closed over",或者如您恰当地称呼它,闭包。