函数内部的匿名函数被调用()

def multipliers():
  return [lambda x : i * x for i in range(4)]

print [m(2) for m in multipliers()]


#执行结果:

[6, 6, 6, 6]

说明:

  上面代码输出的结果是[6, 6, 6, 6] (不是我们想的[0, 2, 4, 6])。

  上述问题产生的原因是Python闭包的延迟绑定。这意味着内部函数(函数内部返回的匿名函数)被调用时,参数的值在闭包内进行查找。因此,当任何由multipliers()返回的函数被调用时,i的值将在附近的范围进行查找。那时,不管返回的函数是否被调用,for循环已经完成,i被赋予了最终的值3。

  因此,每次返回的函数乘以传递过来的值3,因为上段代码传过来的值是2,它们最终返回的都是6(3*2)。

————————
def multipliers():
  return [lambda x : i * x for i in range(4)]

print [m(2) for m in multipliers()]


#执行结果:

[6, 6, 6, 6]

说明:

  上面代码输出的结果是[6, 6, 6, 6] (不是我们想的[0, 2, 4, 6])。

  上述问题产生的原因是Python闭包的延迟绑定。这意味着内部函数(函数内部返回的匿名函数)被调用时,参数的值在闭包内进行查找。因此,当任何由multipliers()返回的函数被调用时,i的值将在附近的范围进行查找。那时,不管返回的函数是否被调用,for循环已经完成,i被赋予了最终的值3。

  因此,每次返回的函数乘以传递过来的值3,因为上段代码传过来的值是2,它们最终返回的都是6(3*2)。