使用 lambda 表达式的字典理解无法产生预期的结果
Dictionary comprehension with lambda expression fails to produce desired result
我正在创建一个单行代码以将 int 字符串映射到函数以测试值是否匹配。理想情况下,结果字典 d
的行为类似于 d['0'](0) is True
和 d['0'](1) is False
。但是,我得到以下输出:
>>> d = { str(i): lambda v: v == i for i in range(3) }
>>> d['0'](0)
False
>>> d['0'](2)
True
我猜是懒惰评估的原因。我想我可以用 for
循环正确地构建字典,但我想要一个单行表达式。
任何人都可以解释为什么这种方法失败以及我如何正确地做到这一点?
您需要为每个 lambda 捕获 i
的当前值,这可以通过默认参数 i=i
完成。参见:
>>> d = { str(i): lambda v, i=i: v == i for i in range(3) }
>>> d['0'](0)
True
>>> d['0'](2)
False
只是一种更合乎逻辑的看待事物的替代方法。
d=dict((str(i),lambda v, i=i: v==i ) for i in range(3))
这将给出与上面相同的结果
我正在创建一个单行代码以将 int 字符串映射到函数以测试值是否匹配。理想情况下,结果字典 d
的行为类似于 d['0'](0) is True
和 d['0'](1) is False
。但是,我得到以下输出:
>>> d = { str(i): lambda v: v == i for i in range(3) }
>>> d['0'](0)
False
>>> d['0'](2)
True
我猜是懒惰评估的原因。我想我可以用 for
循环正确地构建字典,但我想要一个单行表达式。
任何人都可以解释为什么这种方法失败以及我如何正确地做到这一点?
您需要为每个 lambda 捕获 i
的当前值,这可以通过默认参数 i=i
完成。参见:
>>> d = { str(i): lambda v, i=i: v == i for i in range(3) }
>>> d['0'](0)
True
>>> d['0'](2)
False
只是一种更合乎逻辑的看待事物的替代方法。
d=dict((str(i),lambda v, i=i: v==i ) for i in range(3))
这将给出与上面相同的结果