我正在尝试生成(类似)以下字典:
funcs1 = {
'0':lambda x:x==0,
'1':lambda x:x==1,
'2':lambda x:x==2,
'3':lambda x:x==3,
'4':lambda x:x==4,
'5':lambda x:x==5,
}
我试图用这样的列表理解来创建字典:
funcs2 = {str(i):lambda x:x==i for i in range(0,6)}
或者只是使用for循环:
funcs3 = {}
for i in range(0,6):
funcs3.update({str(i): lambda x:x==i})
例如,funcs2
和funcs3
与funcs1
不同,例如,当调用它们每个元素的元素'0'
并将其应用于{{ 1}},结果是不同的:
0
有人可以帮助我,指出我在哪里犯错吗?
答案 0 :(得分:5)
这是由Python late binding引起的常见误解,这应该可以修复您的代码:
funcs1 = {
'0': lambda x: x == 0,
'1': lambda x: x == 1,
'2': lambda x: x == 2,
'3': lambda x: x == 3,
'4': lambda x: x == 4,
'5': lambda x: x == 5,
}
funcs2 = {str(i): lambda x, i=i: x == i for i in range(0, 6)}
funcs3 = {}
for i in range(0, 6):
funcs3.update({str(i): lambda x, i=i: x == i})
print(funcs1['0'](0))
print(funcs2['0'](0))
print(funcs3['0'](0))
输出
True
True
True
答案 1 :(得分:0)
这有效:
>>> def make_fn(i):
... def fn(x):
... return x==i
... return fn
...
>>> funcs = {str(i): make_fn(i) for i in range(6)}
测试,我得到:
>>> funcs['0'](0)
True
>>> funcs['1'](1)
True
>>> funcs['0'](1)
False