日期:2020年2月23日
作者:Commas
注释:学习就是为了忘记,接上一章《浅谈Python3函数命名空间与作用域》,现在讲一下Python闭包;
如果您想了解更多有关Python的知识,那么请点《我的Python浅谈系列目录》
一、闭包的形成
闭包
就是能够读取其他函数内部变量的内部函数,本质上就是函数,常见形式闭包
的三要素:
- 存在一个嵌套函数,即外部函数中有内部函数;
- 内部函数需要调用外部函数的内部变量,即存在对外部函数变量的引用;
- 外部函数需要返回内部函数地址(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 + 1
(1)【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