面试题
代码如下:
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]。