闭包的面试题分析

141 阅读1分钟

面试题

代码如下:

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


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

口述打印结果。

什么是闭包

在一个内部函数中,对外部的作用域(但不是全局作用域的变量进行引用,那么内部函数就会被认为是闭包)

总结为三点

  • 1、是一个内嵌函数
  • 2、对外部函数变量引用
  • 3、外部函数返回内嵌函数

运行结果分析

当我们执行 m(3) 时,运行到ret函数列表的内部函数,发现变量i并不是内部函数中的变量,于是就到外部函数中寻找变量i,但此时外部的 for 已经循环完毕,最后的 i = 3, 所以,每次执行 m(3),i 的值都是 3 ,因此,最终结果会是 [9, 9, 9, 9]。