闭包详解(Python为例)

2023-05-16

不能简单讲,这就要看一些底层的东西(堆栈结构等等,估计还和编译原理有关),我觉得重点在于延迟绑定怎么知道绑定的外层函数的局部变量


python的闭包是延迟绑定

什么是闭包?
  1. 出现函数嵌套, 即外层函数嵌套内层函数, 这就意味着c没有闭包,因为函数不能嵌套定义, 我猜的, 这块打个flag
  2. 内部函数引用外部函数的局部变量 一般我们知道,在栈中的局部变量在函数后退出后就销毁了, 那有什么办法可以不立即这么做?
  3. 外部函数返回值必须是内嵌函数

talk is cheap
#!/usr/bin/python
# -*- coding:utf-8 -*-


def multipliers():
    name = "江湖狗哥我也"
    i = 0
    ret = list()
    for _ in range(4):
        lambda_func = lambda x: i * x + (print(name) is None) - 1 # noqa
        ret.append(lambda_func)
        print(lambda_func.__closure__)
        print("the closure variable i: {}".format(hex(id(lambda_func.__closure__[0].cell_contents))))
        i += 1
    i = 100

    return ret


if __name__ == '__main__':
    for item in multipliers():
        print("the lambda function output: {}".format(item(2)))
        print("闭包中的cell对象组成的元组成: {}".format(item.__closure__))
        print("取出闭包空间中的整数: {}".format(item.__closure__[0].cell_contents))

    for number in list([0, 1, 2, 3, 100]):
        print(hex(id(number)))

__

result

(<cell at 0x0000029926818FD0: int object at 0x0000029926026910>, <cell at 0x0000029926818FA0: str object at 0x0000029926576DC0>)
the closure variable i: 0x29926026910
(<cell at 0x0000029926818FD0: int object at 0x0000029926026930>, <cell at 0x0000029926818FA0: str object at 0x0000029926576DC0>)
the closure variable i: 0x29926026930
(<cell at 0x0000029926818FD0: int object at 0x0000029926026950>, <cell at 0x0000029926818FA0: str object at 0x0000029926576DC0>)
the closure variable i: 0x29926026950
(<cell at 0x0000029926818FD0: int object at 0x0000029926026970>, <cell at 0x0000029926818FA0: str object at 0x0000029926576DC0>)
the closure variable i: 0x29926026970
江湖狗哥我也
the lambda function output: 200
闭包中的cell对象组成的元组成: (<cell at 0x0000029926818FD0: int object at 0x00000299260555D0>, <cell at 0x0000029926818FA0: str object at 0x0000029926576DC0>)
闭包中的整数值: 100
江湖狗哥我也
the lambda function output: 200
闭包中的cell对象组成的元组成: (<cell at 0x0000029926818FD0: int object at 0x00000299260555D0>, <cell at 0x0000029926818FA0: str object at 0x0000029926576DC0>)
闭包中的整数值: 100
江湖狗哥我也
the lambda function output: 200
闭包中的cell对象组成的元组成: (<cell at 0x0000029926818FD0: int object at 0x00000299260555D0>, <cell at 0x0000029926818FA0: str object at 0x0000029926576DC0>)
闭包中的整数值: 100
江湖狗哥我也
the lambda function output: 200
闭包中的cell对象组成的元组成: (<cell at 0x0000029926818FD0: int object at 0x00000299260555D0>, <cell at 0x0000029926818FA0: str object at 0x0000029926576DC0>)
闭包中的整数值: 100
0x29926026910
0x29926026930
0x29926026950
0x29926026970
0x299260555d0

我特意加了一个字符串局部变量, name, 这里其实声明普通函数也可以,特意用了一些比较恶心的用法.
从下面代码我们知道什么

  1. 闭包空间就是一个元组,元素为cell对象, 每个cell对象又包含闭包内容和其它的内容
  2. 每个lambda函数引用外部函数的局部变量name和i这才形成了闭包
  3. 我在局部函数中把i值最后改成100,可以看到最后所有闭包空间中的int都是100了, 这个很合理,因为我改的是
    局部变量,你引用了啊(这里我感觉既不是值传递也不是引用传递, 更不是共享传参, 就好像我盯着i这个标签一样,你怎么变,我最终值就怎么变)
  4. 可以看到multipliers()调用之后就会出现延迟绑定, 即我所有匿名函数(这里是否是匿名函数没有关系), 最终闭包空间的所有值都是100

—————
延迟绑定只是一个表面现象,真正要理解我觉得还有一段路要走

看完龙书再回答一波.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

闭包详解(Python为例) 的相关文章

  • Tkinter:消息小部件中锚点选项的正确值是多少?

    我一直在学习 tkinterTkinter 中的消息小部件 https python course eu tkinter message widget in tkinter php at Python 课程和教程 https python
  • 为什么我的混淆矩阵只返回一个数字?

    我正在做二元分类 每当我的预测等于事实时 我发现sklearn metrics confusion matrix返回单个值 难道没有问题吗 from sklearn metrics import confusion matrix print
  • Tkinter 菜单删除项

    如何删除任何菜单项 例如我想删除 播放 self menubar Menu self root self root config menu self menubar self filemenu2 Menu self menubar self
  • 定义Python源代码编码的正确方法

    PEP 263 http www python org dev peps pep 0263 定义如何声明Python源代码编码 通常 Python 文件的前两行应以以下内容开头 usr bin python coding
  • 如何为未捕获的异常处理程序编写单元测试

    我有一个函数可以捕获uncaught例外情况 如下 有没有办法编写一个单元测试来执行uncaught exception handler 功能正常 但测试正常退出 import logging def config logger logge
  • 将 C++ 指针作为参数传递给 Cython 函数

    cdef extern from Foo h cdef cppclass Bar pass cdef class PyClass cdef Bar bar def cinit self Bar b bar b 这总是会给我类似的东西 Can
  • 使用 Python 3 动态插入到 sqlite

    我想使用 sqlite 写入多个表 但我不想提前手动指定查询 有数十种可能的排列 例如 def insert sqlite tablename data list global dbc dbc execute insert into tab
  • 以类型化内存视图作为成员的结构定义

    目前我正在尝试让一个具有类型化内存视图的结构能够工作 例如 ctypedef struct node unsigned int inds 如果 inds 不是内存视图 据我所知 它可以完美地工作 然而 通过内存视图并使用类似的东西 def
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • 如何使用 opencv python 计算乐高积木上的孔数?

    我正在开发我的 python 项目 我需要计算每个乐高积木组件中有多少个孔 我将从输入 json 文件中获取有关需要计算哪个程序集的信息 如下所示 img 001 red 0 blue 2 white 1 grey 1 yellow 1 r
  • python 中的 h2o 框架子集

    如何在 python 中对 h2o 框架进行子集化 如果 x 是一个 df 并且 Origin 是一个变量 那么在 pandas 中我们通常可以通过以下方式进行子集化 x x Origin AAF 但使用 h2o 框架会出现以下错误 H2O
  • 更改QLineEdit的ClearButton图标

    我想在Windows 10 1909 64位 上的Python 3 8和PyQt5 5 15 0 上更改我的QLineEdit的ClearButton图标 稍后我想在Linux上运行代码 我尝试应用此处找到的代码 如何在 QLineEdit
  • Python“非规范化”unicode 组合字符

    我正在寻找标准化 python 中的一些 unicode 文本 我想知道是否有一种简单的方法可以在 python 中获得组合 unicode 字符的 非规范化 形式 例如如果我有序列u o xaf i e latin small lette
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 如何在 Django Rest 框架中编写“删除”操作的测试

    我正在为 Django Rest Framework API 编写测试 我一直在测试 删除 我对 创建 的测试工作正常 这是我的测试代码 import json from django urls import reverse from re
  • App Engine 实体到字典

    将 google app engine 实体 在 python 中 复制到字典对象的好方法是什么 我正在使用 db Expando 对象 所有属性均为扩展属性 Thanks 有一个名为foo尝试 foo dict
  • 如何从列表类别中对 pandas 数据框进行排序?

    所以我在下面有这个数据集 我想根据我的列表从 名称 列进行排序 以及按 A 升序和按 B 降序排序 import pandas as pd import numpy as np df1 pd DataFrame from items A 1
  • 在 numpy 中连接维度

    我有x 1 2 3 4 5 6 7 8 9 10 11 12 shape 2 2 3 I want 1 2 3 4 5 6 7 8 9 10 11 12 shape 2 6 也就是说 我想连接中间维度的所有项目 在这种特殊情况下我可以得到这
  • Jupyter Notebook:带有小部件的交互式绘图

    我正在尝试生成一个依赖于小部件的交互式绘图 我遇到的问题是 当我使用滑块更改参数时 会在前一个绘图之后完成一个新绘图 而我预计只有一个绘图会根据参数发生变化 Example from ipywidgets import interact i
  • 如何使用xlwt设置文本颜色

    我无法找到有关如何设置文本颜色的文档 在 xlwt 中如何完成以下操作 style xlwt XFStyle bold font xlwt Font font bold True style font font background col

随机推荐

  • 基于STM32读取SBG Ellipse A型号惯导数据

    之前在飞控上用的都是mpu6050 xff0c 但AUV在执行任务时主要在水下环境 xff0c 收不到GPS信号 xff0c 因此对INS的精度要求较高 xff0c 在姿态解算时要考虑地球自转等因素 xff0c 因此需要一款惯导器件能够感受
  • gcc-arm-none-eabi + scons环境搭建、固件烧录小记

    环境搭建在win7系统下进行 1 装git https gitforwindows org 正常下载即可 xff0c 装完后将git路径 xff08 D Program Files Git bin xff09 添加到环境变量中 添加方法 x
  • C语言中常用宏__FUNCTION_和__FILE__、__LINE__的用法介绍

    C C 43 43 提供了三个宏 FUNCTION FILE 和 LINE 用于定位程序运行时发生错误的位置 程序预编译时预编译器将用所在的函数名 xff0c 文件名和行号替换 当运行时错误产生后这三个宏分别能返回错误所在的函数 xff0c
  • Linux命令发送Http的get或post请求(curl和wget两种方法) 及定时任务的设置

    Http请求指的是客户端向服务器的请求消息 xff0c Http请求主要分为get或post两种 xff0c 在Linux系统下可以用curl和wget命令来模拟Http的请求 下面就来介绍一下Linux系统如何模拟Http的get或pos
  • ROS path问题解决方案

    1 问题描述 1 1 在Roboware里面直接右键运行launch文件会出现如下错误 ResourceNotFound hector gazebo worlds ROS path 0 61 opt ros kinetic share ro
  • ubuntu下socket通信

    点击打开原文链接 第一部分为C 43 43 实现 xff0c 第二部分为python实现 第一部分 该socket 的功能是在客户端输入了两个浮点数组成的字符串 xff0c 在服务端接受后将其转换为浮点数输出 xff0c 统一时刻只能有一个
  • ZED相机深度模式+ZED sl中函数介绍

    ZED SDK提供两种深度感应模式 xff1a STANDARD和FILL 该STANDARD模式是ZED的默认深度感应模式 该STANDARD模式保留距离度量和形状 xff0c 并且比FILL模式运行得更快 xff0c 但它包含由于视觉遮
  • 串行通信的数据位,起始位,停止位?

    参考链接 单片机串口通信一般是11位 xff0c 起始位1bit xff0c 数据位8bit xff0c 校验位1bit xff0c 停止位1bit xff0c 串口通信分两种一种是同步通信 xff0c 一种是异步通信 xff0c 像ps
  • linux的UDP通信编程

    这篇文章将对linux下udp socket编程重要知识点进行总结 xff0c 无论是开发人员应知应会的 xff0c 还是说udp socket的一些偏僻知识点 xff0c 本文都会讲到 尽可能做到 xff0c 读了一篇文章之后 xff0c
  • UDP组播服务端与客户端代码实例

    1 组播服务端代码 xff08 数据发送端 xff09 include lt stdio h gt include lt stdlib h gt include lt stdbool h gt include lt string h gt
  • HTTP报文

    HTTP请求报文解剖 http请求报文由3部分组成 xff08 请求行 请求头 请求体 xff09 实际请求报文 是请求方法 xff0c GET和POST是最常见的HTTP方法 xff0c 除此以外还包括DELETE HEAD OPTION
  • IMX6ULL与STM32F103的CAN通信实现

    IMX6ULL与STM32F103的CAN通信实现 硬件连接驱动层实现IMX6ULLSTM32F103ZET6 应用层实现IMX6ULLSTM32F103ZET6 结果 在上一篇博文中 xff0c 我们利用USBCAN设备及其上位机软件 x
  • linux-can编程(一)

    建立can的socket int can create socket char name int fd struct sockaddr can addr struct ifreq ifr socklen t len 61 sizeof ad
  • RTKLIB软件介绍

    转载自南京信息工程大学遥感与测绘工程学院的赵乐文老师的网课 xff08 来源 xff1a B站 xff09 开源GNSS数据处理软件介绍 RTKLIB下载 xff1a http www rtklib comCSDN里的资源 xff1a 快速
  • 将rtklib移植到树莓派

    在Raspberry Pi上构建RTKLIB CUI 材料 xff1a 树莓派4b xff0c NEO M8T 配置参考 这次实验主要相对RTKLIB进行尝试 xff0c 将rtkrcv移植到树莓派上 构建RTKRCV xff08 生成RT
  • 开发中常用的快捷键

    前言 常见的快捷键可以帮助程序员脱离鼠标的束缚 xff0c 提升效率 当然 xff0c 最重要的是可以装逼 Keyboard shortcuts I often use Windows Ctrl 43 Number ALT 43 Esc 使
  • 顶级程序员都在用哪些网站?

    前言 在这里给大家分享一点非常高质量的学习资料和工具网站 欢迎大家留下精彩的网站 xff0c 也可以是生活的 商业的等等 目录 高质量免费在线书籍高质量算法网站开源社区网站在线工具源码查找容器化技术 还有很多 将不定期更新 高质量免费在线书
  • ❤️Python是一个业余的编程语言吗?❤️

    x1f47e 前言 作为一个在python国内还很小众的时候就开始玩Python了 我知道有大佬是2013年就玩的很溜了 xff0c 麻烦让我装个逼 不过Python正渐渐退出了我的主力语言 xff0c golang c rust可能是未来
  • 一文讲清SSL协议

    OSI七层模型 计算机网络的OSI七层模型和TCP IP四层模型想必大家都知道 其中SSL TLS是一种介与于传输层 xff08 比如TCP IP xff09 和应用层 xff08 比如HTTP xff09 的协议 它通过 34 握手协议
  • 闭包详解(Python为例)

    不能简单讲 xff0c 这就要看一些底层的东西 堆栈结构等等 xff0c 估计还和编译原理有关 xff0c 我觉得重点在于延迟绑定怎么知道绑定的外层函数的局部变量 python的闭包是延迟绑定 什么是闭包 出现函数嵌套 即外层函数嵌套内层函