闭包相关[lambda x,i=i: i*x for i in range(5)]
首先:
[lambda x: i*x for i in range(5)] 运行结果: #生成了一个包含5个匿名函数的列表 [<function <listcomp>.<lambda> at 0x0000000004882158>, <function <listcomp>.<lambda> at 0x00000000048821E0>, <function <listcomp>.<lambda> at 0x0000000004882378>, <function <listcomp>.<lambda> at 0x0000000004882400>, <function <listcomp>.<lambda> at 0x0000000004882488>]
进入主题:
def create_multipliers(): return [lambda x: i*x for i in range(5)] for multiplier in create_multipliers(): print(multiplier(2)) 运行结果: 8 8 8 8 8
由于Python的迟绑定(late binding)机制,闭包中内部函数的值只有在被调用时才会进行查询,因此create_multipliers函数返回的lambda函数被调用时,会在附近的作用域中查询变量i的值,而在create_multipliers生成返回数组之后,整数i的值是4,不会再改变,因此返回数组中每个匿名函数实际上都是:
lambda x: 4*x
解决办法是将临时值也保存在匿名函数的作用域内,在声明匿名函数时就查询变量的值:
def create_multipliers(): return [lambda x,i=i: i*x for i in range(5)] for multiplier in create_multipliers(): print(multiplier(2)) 运行结果: 0 2 4 6 8

浙公网安备 33010602011771号