Python-Lambda函数的范围及其参数?
我需要一个与一系列gui事件几乎完全相同的回调函数。该函数的行为会有所不同,具体取决于调用该事件的事件。对我来说,这似乎是一个简单的案例,但是我无法弄清楚lambda
函数的这种奇怪行为。
因此,我在下面有以下简化代码:
def callback(msg): print msg
#creating a list of function handles with an iterator
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(m))
for f in funcList:
f()
#create one at a time
funcList=[]
funcList.append(lambda: callback('do'))
funcList.append(lambda: callback('re'))
funcList.append(lambda: callback('mi'))
for f in funcList:
f()
此代码的输出是:
mimi
mi
do
re
mi
我期望:
dore
mi
do
re
mi
为什么使用迭代器搞砸了?
我试过使用Deepcopy:
import copyfuncList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
但这有同样的问题。
回答:
这里的问题是m变量(参考)来自周围的范围。仅参数保留在lambda
范围中。
为了解决这个问题,你必须为lambda
创建另一个范围:
def callback(msg): print msg
def callback_factory(m):
return lambda: callback(m)
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(callback_factory(m))
for f in funcList:
f()
在上面的示例中,lambda还使用环绕范围来查找m,但是这次callback_factory
是每次callback_factory
调用都创建一次的范围。
或使用functools.partial:
from functools import partialdef callback(msg):
print msg
funcList=[partial(callback, m) for m in ('do', 're', 'mi')]
for f in funcList:
f()
以上是 Python-Lambda函数的范围及其参数? 的全部内容, 来源链接: utcz.com/qa/424105.html