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



我刚刚学会了闭包,我发现:

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。例如,您可以使用 let 关键字在 js 中执行此操作。

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

相反,您可以返回一个绑定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返回一个函数,其中i的值是"封闭的",或者恰当地称之为闭包。

最新更新