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


 

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)。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/280969.html

(0)
上一篇 2022年8月17日 01:21
下一篇 2022年8月17日 01:22

相关推荐

发表回复

登录后才能评论