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

你可能感兴趣的:(Python3)