如何将特定元素与函数关联?解决Python中Lambda函数循环绑定变量的问题
让循环创建的Lambda函数对应列表元素的解决方法
这个问题我太熟悉了!你遇到的是Python闭包的延迟绑定问题——Lambda函数在定义的时候并不会立刻捕获变量i的当前值,而是等到你调用它的时候,才会去查找i的最新值。当循环走完,i已经指向了strings的最后一个元素'c',所以所有Lambda调用时都会输出这个值。
下面给你几个实用的解决方案,都能实现你想要的一一对应效果:
方案1:用默认参数捕获当前值
这是最常用的方法,给Lambda添加一个默认参数,把当前循环的i值绑定进去:
strings = ["a", "b", "c"] functions = [] for i in strings: # 通过默认参数i=i,把当前循环的i值固定到Lambda中 functions.append(lambda i=i: print(i))
原理:在定义Lambda时,默认参数会立刻计算并绑定当前的i值,每个Lambda都拥有自己独立的参数副本,调用时就会使用这个绑定好的值。
方案2:用functools.partial包装函数
如果你不想写Lambda,也可以用functools.partial来提前绑定print函数的参数:
from functools import partial strings = ["a", "b", "c"] functions = [] for i in strings: # partial会把i的当前值绑定到print的第一个参数 functions.append(partial(print, i))
这个方法更直观,partial会生成一个新的函数,直接把目标元素作为print的参数固定下来。
方案3:用列表推导简化写法
和方案1原理一样,只是用列表推导让代码更简洁:
strings = ["a", "b", "c"] functions = [lambda x=i: print(x) for i in strings]
列表推导里的每个Lambda同样通过默认参数x=i捕获当前循环的i值,效果和循环写法完全一致。
现在再测试调用:
>>> functions[0]() 'a' >>> functions[1]() 'b' >>> functions[2]() 'c'
就能得到你想要的Output 1效果啦!
内容的提问来源于stack exchange,提问作者Job
相关产品推荐
相关产品推荐

