Python Lambda函数如何按值捕获变量?问题解析与解决
问题解惑与解决方案
你的猜测完全正确
Python里的lambda函数在列表推导中捕获的是变量的引用,不是循环迭代时变量的即时值。整个列表推导过程中,key始终是同一个变量,每次循环只是更新它指向的值。等你后续调用y[0]()时,循环已经结束,key最终指向字典键的最后一个元素'f',所以所有lambda执行时都会输出'f'。
修复方法
要让每个lambda记住循环时对应的key值,有两种常用写法:
方法1:用默认参数绑定当前值
默认参数会在函数定义时(也就是每一次循环迭代)计算并绑定当前的key值,而非调用时才查找变量:
y = [lambda key=key: print(key) for key in x.keys()]
这时调用y[0]()会输出'a',y[5]()输出'f'。
方法2:使用functools.partial
partial可以预先帮你绑定函数的参数值:
from functools import partial y = [partial(print, key) for key in x.keys()]
每个partial对象都会记住当时的key,调用时直接输出对应内容。
额外需求:让索引为k的lambda输出'a'+k
如果要实现y[k]()输出chr(ord('a') + k),可以直接基于索引生成,不用依赖字典的键:
y = [lambda k=k: print(chr(ord('a') + k)) for k in range(6)]
调用y[0]()输出'a',y[2]()输出'c',以此类推。
内容的提问来源于stack exchange,提问作者Jonathan H
相关产品推荐
相关产品推荐

