首页 > 解决方案 > 如何从 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

标签: python

解决方案


问题在于,根据这篇文章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

推荐阅读