我刚刚学会了闭包,我发现:
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
的值是"封闭的",或者恰当地称之为闭包。