Python之函数进阶-闭包原理

news/2024/12/13 4:09:03/

Python之函数进阶-闭包原理

闭包

  • 自由变量:未在本地作用域中定义的变量,例如定义在内层函数外的外层函数的作用域中的变量
  • 闭包:就是一个概念,出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就形成了闭包。很多语言都有这个概念,最熟悉的就是JavaScript

def inc():c = [0]         # 自由变量def inner():c[0] += 1   # 此处+=的对象是列表中的地址引用return c[0]return inner# 定义一个函数,inner中c[0] += 1,是否可以修改inc中c变量呢?
foo = inc()
print(1, foo())
print(2, foo())# 执行结果是可以修改的,因为inner中修改的是列表中的引用地址。
# 返回结果:1 1
# 返回结果:2 2
c = 100
print(foo())# 定义一个c=100的变量,然后在执行foo(),得到的结果是3,因为c变量是global全局的,print打印foo()函数,用的是函数内的变量,又执行一个所以是3.
# 返回结果:3
def a():x = [1]return id(x)# 定义一个函数a,在函数体中定义一个变量,return 这个变量的id内存地址
a()# 返回结果:4375700544
a()# 每一次函数执行有关系吗?没有,是完全独立的
# 返回结果:4371940480
def inc():a = (100,)c = [0]print(hex(id(c)))def inner():c[0] += 1print(a)return c[0]return innerfoo = inc()
print(foo.__name__, type(foo.__name__))
print(foo.__closure__)
print(1, foo())
print(2, foo())# inner中用到外层函数的自由变量被用到了,所以__closure__要记住,要不然就成垃圾了
# 返回结果:0x104cf5fc0     # 将10进制转换成16进制
# 返回结果:inner <class 'str'>  # foo的名字是inner,类型是str
# 返回结果:(<cell at 0x104a350c0: tuple object at 0x104a35600>, <cell at 0x104a343a0: list object at 0x104cf5fc0>) # 执行closure得到的结果,在closure中记住了c的内存地址
# 返回结果:(100,) # 第一次打印内容
# 返回结果:1 1	 # 第一次打印内容
# 返回结果:(100,) # 第二次打印内容
# 返回结果:2 2	 # 第二次打印内容

图一:闭包原理

请添加图片描述


http://www.ppmy.cn/news/1212060.html

相关文章

ARM Cortex-M体系寄存器结构

General-Purpose Registers (R0-R12) 这些寄存器主要用于存储临时变量。在大多数情况下&#xff0c;指令可以使用任何这些寄存器来执行操作。 Stack Pointer (SP) 该寄存器指向当前的堆栈顶部。ARM Cortex-M 体系结构提供两个堆栈指针&#xff1a;MSP (Main Stack Pointer) 和…

Pytorch常用的函数(四)深度学习中常见的上采样方法总结

Pytorch常用的函数(四)深度学习中常见的上采样方法总结 我们知道在深度学习中下采样的方式比较常用的有两种&#xff1a; 池化 步长为2的卷积 而在上采样过程中常用的方式有三种&#xff1a; 插值 反池化 反卷积 不论是语义分割、目标检测还是三维重建等模型&#xff0…

超全大厂UI库分享,可免费套用!

今天我们要给大家分享的是TDesign、Arco Design、Ant Design、Material design等6个优秀的大厂UI库&#xff0c;一次性打包送给大家&#xff0c;通通免费用。大厂UI库都是经过无数次的事件检验的&#xff0c;扛住了许多种使用场景和突发情况的组件资源库&#xff0c;是前人的经…

win10 安装 node.js

要在你的系统上安装 Node.js&#xff0c;你可以按照以下步骤进行&#xff1a; 1. 打开 Node.js 官方网站&#xff1a;https://nodejs.org/ 2. 在首页上&#xff0c;你会看到两个版本的 Node.js 可供下载&#xff1a;LTS 版本和 Current 版本。LTS 版本是长期支持版本&#xff…

[西湖论剑 2022]real_ez_node

文章目录 前置知识EJS模板注入&#xff08;CVE-2022-29078&#xff09;原型链污染漏洞 &#xff08;CVE-2021-25928&#xff09;HTTP响应拆分攻击&#xff08;CRLF&#xff09; 解题过程代码审计构造payload 前置知识 EJS模板注入&#xff08;CVE-2022-29078&#xff09; EJS…

蓝桥杯算法竞赛第一周题型总结

本专栏内容为&#xff1a;蓝桥杯学习专栏&#xff0c;用于记录蓝桥杯的学习经验分享与总结。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f33…

使用 HTTP Client 轻松进行 API 测试

在开发过程中&#xff0c;我们经常需要测试 API 接口以确保其正常工作。JetBrains 的集成开发环境&#xff08;IDE&#xff09;如 CLion、IntelliJ IDEA、PyCharm 等&#xff0c;默认内置了 HTTP Client 插件&#xff0c;可以方便地进行API测试。本文将介绍如何使用HTTP Client…

将复数中的虚部取反 即对复数求共轭 numpy.conjugate()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将复数中的虚部取反 即对复数求共轭 numpy.conjugate() [太阳]选择题 请问以下代码中执行语句输出结果是&#xff1f; import numpy as np a np.array([1 2j, 3 - 4j]) print("【显示…