python 在闭包中引用循环变量的解释

最近在看一些别人的代码的时候突然遇到了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()的时候会报错,没理解。这个问题先暂时搁置。如果后面我知道了在做补充,嘿嘿

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值