以下代码有什么问题?
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
答案 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
值的影响。