def count():
fs = []
for i in range(1,4):
def f():
return i*i
fs.append(f)
return fs
#第一种写法:
f1, f2, f3 = count()
print(f1(), f2(), f3())
"""#第二种写法:fn = count()print(fn[0](), fn[1](), fn[2]())"""
#【详解】刚开始可能以为结果是1,4,9 但是结果却是9,9,9
"""
1.运行f1,f2,f3 = count() ---> 计算机会执行count函数,先是创建fs这个列表,然后进入for循环
当 i=1 时候:创建一个f函数的框架,但f内部根本不会执行任何的东西,然后返回存储f函数的地址给fs[0]
当 i=2 时候:同上...... 然后返回存储f函数的地址给fs[1]
当 i=3 时候:同上...... 然后返回存储f函数的地址给fs[2]
最后返回fs这个列表
2.运行print()语句时候:先执行f1对应的这个函数,也就是f(),【这时候早在第一步for循环时候i已经成为3了,所以返回的 i*i 是用的i=3】
之后的f2, f3的解释也是和f1一样的
3.【实质】闭包(内嵌):
a. 在执行外部函数时,是不会执行内部函数的任何东西的,只有在调用内部函数时才会真正的执行(实质其实是基础知识,函数分为创建和执行两个部分,执行外部函数当然就是创建内部函数的过程,执行这个得再一步实施)
b. 函数的局部变量只能在函数内使用,出了函数就不行了,但是内部嵌套的函数还是可以继续使用的,因为嵌套的函数还是属于这个函数的内部的,不过只能是只读的状态,不能修改(你可以这样理解,但实际可能并不是这样:外部函数执行完毕后,它就会退出内存,存到硬盘里,内存是可以修改的,但是硬盘里只能读,不能修改)
4.【用处】我们都知道函数内创建的变量都是局部的只能在函数内使用,出了函数就不能使用了,但是有些情况是真的想用函数内创建的变量时怎么办?
难道不能用吗? 所以就利用了闭包(嵌套函数)这个东西,因为只能在函数内使用这个变量嘛,所以就在函数内专门创建一个函数来使用这个局部变量
"""