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",或者如您恰当地称呼它,闭包。
我刚学了闭包,我发现:
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",或者如您恰当地称呼它,闭包。