如何创建元素为单参数lambda函数的推导式?解决闭包与参数限制
解决方案
要实现仅接受单个参数、同时解决闭包延迟绑定问题的函数,可以通过嵌套lambda的立即执行调用来固定每个函数绑定的索引值:
e0, e1, e2 = [(lambda i: lambda e: e[i])(i) for i in range(3)]
验证效果
测试代码:
t = 'abc' print(e0(t), e1(t), e2(t)) # 输出:a b c # 尝试传入第二个参数会直接报错,符合要求 # e0(t, 2) # TypeError: <lambda>() takes 1 positional argument but 2 were given
原理说明
- 外层的
(lambda i: lambda e: e[i])(i)会在循环的每一次迭代中立即执行:把当前循环的i值传入外层lambda的参数i,这个i是当前迭代的局部变量,不会随后续循环变化。 - 内层lambda只定义了
e一个参数,捕获的是外层lambda的局部变量i,既解决了闭包延迟绑定的问题,又保证函数只能接受一个参数,无法通过传入额外参数篡改行为。
替代方案(需导入模块)
如果愿意使用functools.partial,可以通过关键字参数固定索引,同样能实现需求:
from functools import partial e0, e1, e2 = [partial(lambda e, i: e[i], i=i) for i in range(3)]
这种方式下,调用时传入额外参数会因参数冲突报错,同样禁止了篡改行为,但需要额外导入模块,嵌套lambda的方式更轻量简洁。
内容的提问来源于stack exchange,提问作者mins
相关产品推荐
相关产品推荐

