将lambda函数赋给数组

时间:2015-01-09 04:05:04

标签: python lambda

以下代码有什么问题?

arrs={}
def func(i):
    print i
for i in range(1,5):
    arrs[i]=lambda:func(i)
for key in arrs.keys():
    arrs[key]()

我希望它打印1 2 3 4.而不是打印4 4 4 4

1 个答案:

答案 0 :(得分:0)

这是使用lambda时遇到的常见问题。运行arrs[i]=lambda: func(i)时,lambda不会生成保留当前i值的函数。这实际上与正常的函数定义完全相同:

def func(i):
    return i

i = 5
def anon():
    return func(i)

i = 0
anon()

i被视为任何标准变量,其值最初在函数的本地命名空间中搜索,并且由于它不存在,它将在该位置搜索名称。全球水平。此时,它会在最初定义函数时找到i的当前值,而不是i的值。

解决这个问题(以及一个常见的习惯用语)是使用输入创建lambda函数,并将当前值i指定为默认参数。

arrs={}
def func(i):
    print i
for i in range(1,5):
    arrs[i]=lambda i=i:func(i)
for key in arrs.keys():
    arrs[key]()

这会将函数定义时i的值绑定为默认参数,因此不受全局i值的影响。