Python之函数进阶-nonlocal和LEGB

Python之函数进阶-nonlocal和LEGB

nonlocal语句

  • nonlocal:将变量标记为不在本地作用域定义,而是在上级的某一级局部作用域中定义,但不能是全局作用域中定义。

函数的销毁

  • 定义一个函数就是生成一个函数对象,函数名指向的就是函数对象。
  • 可以使用del语句删除函数,使其引用计数减1。
  • 可以使用同名标识符覆盖原有定义,本质上也是使其引用计数减1。
  • Python程序结束时,所有对象销毁。
  • 函数也是对象,也不例外,是否销毁,还是看引用计数是否减为0。

变量名解析原则LEGB

  • Local,本地作用域、局部作用域的local命名空间。函数调用时创建,调用结束消亡
  • Enclosing,Python2.2时引入了嵌套函数,实现了闭包,这个就是嵌套函数的外部函数的命名空间
  • Global,全局作用域,即一个模块的命名空间。模块被import时创建,解释器退出时消亡
  • Build-in,内置模块的命名空间,生命周期从python解释器启动时创建到解释器退出时消亡。例如 print(open),print和open都是内置的变量

图一:LEGB

请添加图片描述


def inc():
    c = 0
    def inner():
        c += 1
        return c
    return inner

f = inc()
print(1, f())
print(2, f())

# 报错原因,inner中c += 操作是inner函数中的c,因为没有定义inner中的c变量,所以不能用。
# 报错内容:UnboundLocalError: cannot access local variable 'c' where it is not associated with a value
def inc():
    c = 0 # 自由变量,局部变量
    def inner():
        global c
        c += 1
        return c
    return inner

f = inc()
print(1, f())
print(2, f())

# 报错原因:inner定义了global c,但是python全局中没有c变量
# 报错内容:NameError: name 'c' is not defined
def inc():
    global c
    c = 0 # 自由变量,局部变量
    def inner():
        global c
        c += 1
        return c
    return inner

f = inc()
print(1, f())
print(2, f())

# inc中和inner中都必须定义global才能使用
# 返回结果:1 1
# 返回结果:2 2
c

# 返回结果:2
del c

# 删除变量c
def inc():
    c = 0 # 自由变量,局部变量
    def inner():
        nonlocal c # nonlocal c表示不是inner的c,那就是inc的c 
        c += 1     # 闭包在c += 1这里,因为这个c不是inner的是它上一层inc的c,所以需要闭包
        return c
    return inner

f = inc()
print(1, f())
print(2, f())

# 返回结果:1 1
# 返回结果:2 2
def a():
    nonlocal c
    c = 100
print(a())

# 报错原因:nonlocal c不是本函数的c,只能向上一层函数找,但是在上一层就是global了,nonlocal不允许在global中使用。
# 报错内容:SyntaxError: no binding for nonlocal 'c' found
def inc():
    a = 1000 
    c = 0
    def inner():
        nonlocal c
        c += 1
        return c
    return inner

f = inc()
print(1, f())
print(2, f())

# 此代码主要说明,a没有闭包,因为在嵌套函数inner中没有使用到a
def inc():
    a = 1000 
    c = 0
    def inner():
        nonlocal c
        c += 1
        return c
    def t():
        nonlocal a
        print(a)
    print(t.__closure__)
    return inner
    return t

f = inc()
print(1, f())
print(2, f())

# 此代码中,a和c都用到了闭包,因为函数inner用了c,函数t用了a
c = 0
def a():
    c = 1
    def b():
        c = 2
        def c():
            c = 3
            print(c)
            
# 闭包遵循就近原则,此代码为例,如函数c的c变量注释掉,打印的c就是函数中的c,以此类推。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/134923.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【中间件篇-Redis缓存数据库05】Redis集群高可用高并发

Redis集群 Redis Cluster是Redis的分布式解决方案,在3.0版本正式推出,有效地解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡的目的。之前,Redis分布式方案一般有两种: 1、客户端分…

vue 使用js new Map()优化多个if else 执行方法

前言 在实际开发中根据业务需求我们经常要判断情况,一个if 我们科技直接使用ES6就可以解决 经常会出现根据不同的条件执行不同的方法,这是就会有多个if else 看起不太美观也费劲 js new map ()就可以解决这个问题,它…

Tkinter,一个轻量级的Python GUI库

欢迎关注作者微信公众号:愤怒的it男 Tkinter(即 tk interface,简称“Tk”)本质上是对Tcl/Tk软件包的Python接口封装,属于Python自带的标准库,安装好Python后可以直接使用Tkinter库而无须另行安装。Tkinter库…

Python开源项目PGDiff——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

python ansconda 等的下载、安装等请参阅: Python开源项目CodeFormer——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践https://blog.csdn.net/beijinghorn/article/details/134334021 友情提示: …

建行广东省江门市分行走进农村地区开展反假货币宣传

人民对美好生活的向往,涉及方方面面,小至“钱袋子”安全。建行广东省江门市分行落实当地监管部门部署,积极扛起维护国家金融安全的重要政治责任,深入农村地区开展反假货币宣传工作,助力构建农村反假货币工作长效机制。…

递归和master公式

前置知识:无 1)从思想上理解递归:对于新手来说,递归去画调用图是非常重要的,有利于分析递归 2)从实际上理解递归:递归不是玄学,底层是利用系统栈来实现的 3)任何递归函…

什么是AI算子开发

今天在某离职群里看到前同事聊天,说到国内某大厂的一个面试,本来求职面试的岗位是通信库,类似于英伟达的 nccl, 但是却被问到了很多与算子开发相关的问题。 看来算子开发岗位依然很稀缺。 联想到之前写过的一篇关于AI算子开发的文…

【JAVA进阶篇】与数据结构结合?这些知识你应该知道

个人主页:【😊个人主页】 系列专栏:【❤️JAVA进阶】 文章目录 前言关与JAVA中的数据结构Java中的数据结构 枚举位集合创建一个初始大小的位集合设置特定的位从另一个位集合中复制位迭代位集合中设置为1的位将位集合转换为字节数组将字节数组…

如何在 Azure 中使用自动机器学习进行模型训练

自动机器学习(Automated Machine Learning,简称为AutoML)是一种通过自动化流程来简化模型训练和调优的技术。在Azure机器学习平台中,AutoML提供了丰富的功能和工具,使我们能够快速地训练和优化机器学习模型。本文将介绍…

nodejs多版本管理

背景 在开发过程中经常会用到不同的nodejs版本,程序在不同版本之间又可能不兼容的情况。一般的做法就是卸载nodejs然后安装需要的版本,这样太过于麻烦。实际上跟conda一样,可以做多版本的管理 解决方法 安装nvm管理nodejs版本,…

windows上运行yolov3代码详解(小白)

batch_normalize1 # 是否做BN 代码链接 环境配置 没有Anaconda的话可以安装下 首先创建虚拟环境,名称随意,版本3.9.我觉得挺好的 激活虚拟环境 conda activate 刚刚创建的环境名称 切换到requirements.txt目录下,直接vscode打开yolov3文件…

Linux应用开发基础知识——字符文字编码(五)

前言: TXT 文件中保存的是字符的核心:它的编码值。而 Notepad 上显示时, 这些字符对应什么样的形状态,这是由字符文件决定的。编码值,字体是两个不一样的东西,比如 A 的编码值是 0x41,但是在屏幕…

2.2 CE修改器:未知数值扫描

本关需要扫描未知数只扫描,要在不知道初始值的情况下找到一个在0到500之间的数值。首先,选择“未知的初始值”扫描方式,在数值类型中选择 4 字节,并点击“首次扫描”以开始扫描。扫描结束后,点击“打我”按钮进行一些操…

CS224W5.3——信念传播

此文中,我们介绍信念传播,这是一种回答图中概率查询的动态规划方法。通过迭代传递消息给邻居节点,如果达成共识,则计算最终的信念值。然后,我们通过示例和泛化树结构展示消息传递。最后讨论了循环信念传播算法及其优缺…

建行驻江门市分行纪检组以政治谈话压责任促发展

开展政治谈话,是加强“一把手”和领导班子监督、严肃党内政治生活、加强对党员领导干部日常教育管理的有效手段。 为督促“一把手”和领导班子成员依法依规履行职责、行使权力,推动党中央重大决策部署以及建设银行总行、广东省分行党委的决策部署在本单…

数据结构之红黑树

红黑树的概念 红黑树(Red-Black Tree)同AVL树一样, 也是一种自平衡的二叉搜索树, 但在每个结点上增加一个存储位表示结点的颜色, 可以是Red或Black, 通过对任何一条从根到叶子的路径上各个结点着色方式的限制, 红黑树确保没有一条路径会比其他路径长出俩…

Vue23组件自定义事件 和 解绑事件

Vue2&3组件自定义事件 和 解绑事件 Vue2组件自定义事件 功能:父组件绑定数据,子组件触发事件。(父绑子触发) 实现步骤(前三步在父组件实现,第四步在子组件实现): 第一步&#…

测试用例的设计方法(黑盒)

1.基于需求的设计方法 比如针对网易邮箱进行测试:分为功能相关和非功能相关两大类 但是这么设计的话,有无数多个测试用例,我们现在看到的只是一些大概的测试用例,要想设计具体的测试用例,需要用到下面测试用例的方法…

盘点双11!阿里妈妈助这些品牌短视频赢增长!

刚刚!一年一度的双11落下帷幕,很多新变化值得回味。 尽管天气在变凉,但市场出现了逐渐回暖的迹象。在此背景下,大量商家特别关心如何在双11打一场漂亮的胜仗。 卖方如何行动,关键在于买方的变化。在阿里妈妈发布的《…

神经网络(第二周)

一、简介 1.1 需求预测示例 1.1.1 逻辑回归算法 根据价格预测商品是否畅销。特征:T恤的价格;分类:销售量高1/销售量低0;使用逻辑回归算法进行分类,拟合效果如下图所示: 1.1.2 神经元和神经网络 将逻辑回…