首页 > 解决方案 > 通过 for 循环定义 lambda 的 python 字典

问题描述

我需要通过 for 循环定义一个 python lambda 函数字典。每个 lambda 函数都需要相对字典键的值才能工作,但我希望避免将这样的键作为参数传递。这是我的问题的虚拟版本。

给定

a = {'bar': 0, 'foo': 1}  # a reference dictionary 

dic1 = {'bar': lambda x: x['bar'], 'foo': lambda x: x['foo']}
dic2 = {key: lambda x: x[key] for key in a}

我希望 dic1 和 dic2 做同样的事情,但是只有 dic1 表现得像我想要的那样。特别是,结果

print(dic1['bar'](a), dic1['foo'](a))
print(dic2['bar'](a), dic2['foo'](a))

0 1
1 1

代替

0 1
0 1

标签: pythonpython-3.x

解决方案


它不起作用的原因与Python 中的后期绑定闭包有关。

Python 的闭包是后期绑定的。这意味着在调用内部函数时会查找闭包中使用的变量的值。

改编源解释,每当调用返回函数时,都会key在调用时在周围范围内查找 的值。到那时,循环已经完成并key留下它的最终值'foo'

您可以通过使用默认参数创建一个立即绑定到其参数的闭包来解决此问题,如下所示:

a = {'bar': 0, 'foo': 1}  # a reference dictionary 

dic1 = {'bar': lambda x: x['bar'], 'foo': lambda x: x['foo']}
dic2 = {key: lambda x, key=key: x[key] for key in a}

print(dic1['bar'](a), dic1['foo'](a))
print(dic2['bar'](a), dic2['foo'](a))

结果:

0 1
0 1

推荐阅读