闭包相关[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

 

posted @ 2017-09-22 17:17  Dylan_Wu  阅读(1518)  评论(0)    收藏  举报