python - 如何从 lambda 函数中的变量生成持久值
问题描述
我有一个属性字典和它们的极限值。对于包含“max”的属性,限制值是允许的最大值。同样适用于最小值。
我正在尝试创建一个函数字典。每个函数都会根据列表属性的限制值检查输入值。
limits = {'variable1 max': 100,
'variable1 min': 10}
check_acceptable = {key: (lambda x: x < lim) if 'max' in key else
(lambda x: x > lim)
for key, lim in limits.items()}
# Now, I'd expect this to be True, since 90 < 100:
check_acceptable['variable1 max'](90)
Out: False
这里发生的事情是 lambda 函数被分配了变量lim
,并且在 for 循环中,lim
最后一个值为 10,那么我的第一个 lambda 函数是错误的。
我该如何解决?
--- 编辑 - 添加相同行为的更通用示例:
funcs = []
for i in range(5):
funcs.append(lambda _: i)
for j in range(5):
print(funcs[j](j), end='')
# Expected: 01234
Out: 44444
解决方案
问题在于,根据这篇文章lambda
,dict理解中的每个都只捕获lim
它找到的最后一个版本。我们可以通过对参数进行一些柯里化来绕过这个限制:lim
limits = {'variable1 max': 100,
'variable1 min': 10}
check_acceptable = {key: (lambda lim: (lambda x: x < lim))(lim) if 'max' in key else
(lambda lim: (lambda x: x > lim))(lim)
for key, lim in limits.items()}
以上将允许每个lambda
人捕获它遇到的每个参数;它按预期工作:
check_acceptable['variable1 max'](90)
=> True
推荐阅读
- reactjs - 代码空间 (online.visualstudio.com) - 找不到模块 'tslint/lib/tsLintCli.js'
- jquery - 如何在jquery中单击iFrame时更改动态添加的iframe的背景颜色
- vb.net - 为什么我的 Visual Studio 不显示任何文本?
- javascript - 将数据保存到 sharedPreference android 并读取 react native
- flutter - 在 dispose 方法中获取提供程序方法不起作用
- java - 我们如何在 birt 预览之前调用 Rest Service
- android - 当我将回收站视图滚动到顶部时,回收站视图项目消失
- amazon-web-services - AWS Redshift 查询过长异常
- c - avx 程序 (Linux) 上的分段错误(核心转储)
- swift - 为什么objectWillChange没有效果