最近在看一些别人的代码的时候突然遇到了python的闭包,(我学python的时候一般都是用到哪里看到哪里)所以突然看到闭包这里刚开始一下子没看懂。所以在网上百度了下资料。有好几篇对于闭包的概念的解释我是可以理解的。但是到在闭包中引用循环的时候就有点没看懂那个代码。为此特别写了这个。和大家交流下,不对的地方欢迎大牛指正,谢谢
python闭包了解:https://www.jianshu.com/p/e5377fa362a9
就是这个,刚开始我以为返回的应该是1,4,9.但是后面看别人的博客说是等于9.我看了1天都没看懂和理解。
到下午重新琢磨了下,突然开窍了。所以这里记录并和大家分享下
def count():
fs = []
for i in range(1, 4):
def f():
return i**2
fs.append(f)
return fs
首先大家看下上面的这个函数count().它是一个嵌套函数,除此外他还带了一个循环。并且在循环末尾将内函数加到了它的列表里。这个看起来打眼一瞅我真的觉得fs.append(f)这句执行的时候应该是效果等同于fs.append(f())。但其实并不然。这里没带()的f其实并不是调用f方法。我们可以暂时将它理解为这个方法的物理地址(我因为不知道,所以先跟自己这么说去记忆,如果有大牛知道这个是啥可以告诉我,我完善下谢谢!)。所以
1、在执行fs.append(f)的时候这里确实根据循环执行了三遍,证据如下。在上述代码下方加上如下代码,然后右键执行
执行结果如下:
C:\Users\15010\PycharmProjects\TestPro\venv\Scripts\python.exe C:/Users/15010/PycharmProjects/TestPro/pro/test.py
[<function count.<locals>.f at 0x0000021B9BAAA620>, <function count.<locals>.f at 0x0000021B9BAAA840>, <function count.<locals>.f at 0x0000021B9BAAAB70>]
Process finished with exit code 0
注意:看下黑体加粗的部分,是我标注的执行结果。也就是说这是此时f中存储的对象。
2、如果了解过for循环的人,那么此时就一定知道。目前外函数中i是等于3的。而内函数因为没有被调用(如果了解过闭包概念的人,应该也就知道这一点)。因此是没有被执行的
3、然后此时若是执行f1()才相当于是在调用count()函数的内函数f(),那么这个时候传递给内函数的i因为外面的循环已经执行过了。因此此时的i=3.那么返回的值也就是9了。此时是不会再执行外函数了。因此这个时候再完毕后再去打印列表得到的列表内容预期应和之前 打印的结果相同。
其实后面我在执行的时候还遇到一个问题,那就是单独调用f1()的时候会报错,没理解。这个问题先暂时搁置。如果后面我知道了在做补充,嘿嘿