我想使用不同的参数制作多个lambda函数,并将它们绑定到字典。
dic_funcs = {}
dates = ['2018', '2019', '2020']
idx = ['0', '1', '2']
def printt(text):
print(text)
for d in dates:
for i in idx:
#print(d, i)
dic_funcs[d + '_' + i] = lambda:printt(d + '_' + i)
for key, item in dic_funcs.items():
print(key)
item()
print('-----')
我认为每个键和对应值(lambda函数)的结果都相同,但事实并非如此。
2018_0
2020_2
-----
2018_1
2020_2
-----
2018_2
2020_2
-----
2019_0
2020_2
-----
2019_1
2020_2
-----
2019_2
2020_2
-----
2020_0
2020_2
-----
2020_1
2020_2
-----
2020_2
2020_2
-----
我想我每次都绑定相同的日期和索引号。可能是什么问题呢?如果能得到一些帮助,我将不胜感激。
答案 0 :(得分:1)
在lambda表达式中,您有一个i
,它是从idx
到循环的,另外还有一个d
,它是从dates
到循环的。 lambda表达式中的这两个值不是在函数定义时求值,而是在调用函数时求值,因此,每次执行print(d + '_' + i)
时,该函数只会查询d
的当前值和i
,这只是for d in dates
和for i in idx
中最后一件事的值,这就是为什么每次都获得相同值的原因。
您可以通过以下方法解决此问题:
dic_funcs[d + '_' + i] = lambda a=i, b=d:printt(b + '_' + a)
这会给您预期的行为