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()

此代码的输出是:

mi

mi

mi

do

re

mi

我期望:

do

re

mi

do

re

mi

为什么使用迭代器搞砸了?

我试过使用Deepcopy:

import copy

funcList=[]

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 partial

def 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

回到顶部