python - 通过 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
解决方案
它不起作用的原因与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
推荐阅读
- java - 在线程“主”com.fasterxml.jackson.databind.exc.MismatchedInputException 中获取异常:无法反序列化
- qt - 通过安装程序框架和 qtbinarycreator 构建 qtApp - 即使在设置路径 Win10 后也找不到 qt dll - 有人有这个问题吗?
- sql - 如何将表中的单元格值拆分为 SQL 查询或 Informatica 映射中的多个列
- aws-iot - 如何从 AWS Shadow 获取更新到 AWS IoT Analytics
- docker - Docker Compose网络:如果跨多个文件和服务定义不存在则创建?
- mitmproxy - mitmdump 能否用于捕获 HTTPS 并将会话存储在 HAR 或 SAZ (Fiddler) 文件中?
- javascript - 如何测试 Twilio TaskRouter 的“Websocket Disconnected”?
- json - 如何使用 XE2 dbxJSON 解析 JSON
- r - 从 R 写入 Excel 文件的单个单元格
- java - 使用 GSON 在自定义类中添加序列化方法