标签:pre 赋值 return 第二部分 一次函数 循环 函数返回 app 结果
1.下面题目的打印结果是:__________
lst1 = [lambda x:i+x for i in range(5)] lst2=[el(2) for el in lst1] print(lst2)
(1) 将面目全非的题目进行还原得到如下形态:
lst1=[] lst2=[] for i in range(5): def func(x): return i+x lst1.append(func) print(lst1) for el in lst1: lst2.append(el(2)) print(lst2)
基本能看出第一次循环创建了5个函数,然后将函数的内存地址存到列表里,lst1的打印结果是一堆内存地址,此时在第一部分它形成一个闭包这个看的不舒服,将第一部分换个形态
def func1(): for i in range(5): def func(x): return i + x lst1.append(func) return lst1 func1()
这就可以看出是个典型的闭包,来回忆下闭包的内容,重新认识下这个东西:
闭包的两个特性:
对上面的函数进行简化,去掉for循环,使用单个变量代替,直接返回内部函数名
def func1(): i=4 # 定义了变量,也称为内部函数的环境变量,它不会改变,不被外界影响 def func(x): return i + x # 使用了外部函数的变量 return func # 返回了内部函数 func1()
简单理解:闭包 = 内部函数 + 环境变量
闭包的特性:当内部函数返回的时候,会把连同内部函数定义时候的环境变量一同返回
(2)在进行第二部分调用内部函数
在lst1中的元素是5个这个函数的函数内存地址,但是调用时候,此时i=4,分别调用一次函数.结果就是[6,6,6,6,6]
标签:pre 赋值 return 第二部分 一次函数 循环 函数返回 app 结果
原文地址:https://www.cnblogs.com/wcx666/p/9687498.html