题目:分析代码结果
def num():
return [lambda x:i*x for i in range(4)]
print([m(2)for m in num()])
代码输出是[6,6,6,6]
此题目涉及闭包问题,首先来了解一下什么是闭包:
闭包是嵌套在函数中的函数
闭包必修是内层函数对外层函数的变量(非全局变量)的引用
像下面的实例一样 a就是闭包
def wrapper():
a = 1
def inner():
print(a)
return inner
ret = wrapper()
闭包有什么作用呢?
1.保存局部信息不被销毁,保证数据的安全性。
2.装饰器的本质
如何区分闭包?
print(XXX.__code__.co_freevars)
那么回到原理的题目 可以把匿名函数转回普通形式的函数:
def num():
dic = []
for i in range(4): #值得注意 这里的i 并不是0123 而是3
def num2(x):
return x * i
dic.append(num2)
return dic
因位内层嵌套函数的变量i 是在for 循环外层函数的for循环中的i 执行完才引用的,这是一个闭包的概念