Python3之闭包浅谈

日期:2020年2月23日
作者:Commas
注释:学习就是为了忘记,接上一章《浅谈Python3函数命名空间与作用域》,现在讲一下Python闭包;
如果您想了解更多有关Python的知识,那么请点《我的Python浅谈系列目录》



一、闭包的形成

闭包就是能够读取其他函数内部变量的内部函数,本质上就是函数常见形式闭包的三要素:

  1. 存在一个嵌套函数,即外部函数中有内部函数;
  2. 内部函数需要调用外部函数的内部变量,即存在对外部函数变量的引用;
  3. 外部函数需要返回内部函数地址(1+2即可形成闭包,可用函数内部属性__closure__查看);
__closure__值说明
None不是一个闭包
元组值是一个闭包,返回值为被引用外部变量的地址元组值

二、闭包的示例

def outer(outer_var1):
    """外部函数"""
    outer_var2 = 1

    def inner():
        """
        内部函数:计算两数相加
        因为outer_var1和outer_var2被内部函数调用,且内部函数地址返回到外部
        所以这两个变量会一直驻留在内存中,__closure__属性可以查看闭包信息
        """
        inner_var = outer_var1 + outer_var2
        print("{} = {} + {}".format(inner_var, outer_var1, outer_var2))
    # 调用内部函数,并返回内部函数返回值(实际为内部函数地址)
    return inner


# 接收闭包(函数)地址
print("接收闭包(函数)地址")
add_num = outer(1)
# 函数执行:函数名()
print("函数执行:函数名()")
add_num()
print("(1)【add_num】分析结果如下:", "-"*20)
print("add_num的内存地址:{}".format(add_num))
print(add_num.__closure__)
print("函数内部属性__closure__的类型:{}".format(type(add_num.__closure__)))
print("(2)【outer】分析结果如下:", "-"*20)
print("outer的内存地址:{}".format(outer))
print(outer.__closure__)
print("函数内部属性__closure__的类型:{}".format(type(outer.__closure__)))
======【控制台输出】======
接收闭包(函数)地址
函数执行:函数名()
2 = 1 + 11)【add_num】分析结果如下: --------------------
add_num的内存地址:<function outer.<locals>.inner at 0x000001547FA698C8>
(<cell at 0x000001547F9ED888: int object at 0x00007FFE1F44E350>, <cell at 0x000001547F9ED8B8: int object at 0x00007FFE1F44E350>)
函数内部属性__closure__的类型:<class 'tuple'>2)【outer】分析结果如下: --------------------
outer的内存地址:<function outer at 0x000001547F22C268>
None
函数内部属性__closure__的类型:<class 'NoneType'>

版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/104446394

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Commas.KM

码路共同进步,感恩一路有您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值