Python之函数进阶-nonlocal和LEGB

news2025/1/11 10:54:05

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,以此类推。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

72 内网安全-域横向CSMSF联动及应急响应初识

目录 演示案例:MSF&CobaltStrike联动ShellWEB攻击应急响应朔源-后门,日志WIN系统攻击应急响应朔源-后门,日志,流量临时给大家看看学的好的怎么干对应CTF比赛 涉及资源 权限维持留到后面在补充,先把后面的知识点给大家讲起来,因为权限维持它是我们前期…

HBuilderX vue项目打包上传到服务器

完成后有个’dist’目录,把真个目录通过FTP 上传到服务器,Mac电脑使用cyberduck 上传 服务器使用‘宝塔’进行一件部署,基本上就是傻瓜式的点击下一步

软件过程模型分析与适应场景: 瀑布、原型、增量、螺旋、组件化和统一模型简介

软件过程模型: 瀑布模型 ​ 有很强的前后关联性,前一阶段的输出是后一阶段的输入,而且不可回溯性。 适应场景: ​ 软件开发人员经验丰富​ 需求变化少,变更少,可以一次性获取全部需求​ 项目风险低&…

【开放视频+文档】Spinnaker多云持续部署实践

Hello, 首先,继续感谢大家持续的关注! 这次我们已经将《Spinnaker实践》课程 实践文档课程笔记实验源码视频回放 全部免费开放给所有的技术人员。文档库视频基于语雀,扫描图片二维码可以获取语雀文档链接“https://www.yuque.com/devopsgr…

Web APIs——正则表达式使用

1、什么是正则表达式 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在JavaScript中,正则表达式也是对象 通常用来查找、替换那些符合正则表达式的文本,许多语言都支持正则表达式 1.1 正则表达式使用场景 例如…

nodejs多版本管理

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

第2关:还原键盘输入(list)

题目&#xff1a; 知识点&#xff1a; 列表list相较于数组&#xff1a; 优势&#xff1a;可在任意指定位置插入或者删除元素而不影响列表其他地方 。 劣势&#xff1a;无法直接进行下标索引&#xff0c;需要迭代器it逐个遍历。 代码&#xff1a; #include <iostream>…

(2023|CVPR,扩散,主体标识符,先验保存损失)DreamBooth:微调文本到图像的扩散模型以实现主题驱动的生成

DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.…

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

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

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

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

jbase支持连IRIS

jbase设计的时候就抽取了IDbFactory接口&#xff0c;支持不同数据库只要配置该接口实现类即可&#xff0c;那么就用IRIS测试下多数据库支持。 首先从IRIS安装目录拷贝jar包 然后实现数据库驱动接口 package LIS.Dal.Base;import LIS.Core.MultiPlatform.LISConfigurtaion;…

Python 潮流周刊#26:requests3 的现状

△点击上方“Python猫”关注 &#xff0c;回复“1”领取电子书 你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。本周刊开源&#xff0c;欢迎投稿[1]。另有电报频道[2]作为副刊&#xff0c;补充发布更加丰富的资讯。 &#…

微信小程序隐私政策不合规,应当由用户自主阅读后自行选择是否同意隐私政策协议,不得默认强制用户同意

小程序隐私政策不合规&#xff0c;默认自动同意《用户服务协议》及《隐私政策》&#xff0c;应当由用户自主阅读后自行选择是否同意隐私政策协议&#xff0c;不得默认强制用户同意&#xff0c;请整改后再重新提交。 把 登录代表同意《用户协议》和《隐私政策》 改为 同意《用…

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

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

游戏交易平台系统源码下载 网络游戏币、装备、账号、道具等交易网站源码

最新仿7881游戏交易平台系统源码下载网络游戏币、装备、账号、道具等交易网站源码 下载地址&#xff1a;https://bbs.csdn.net/topics/617562568

嵌入式软件开发是个啥职业?

在硬件行业中&#xff0c;有一类工作岗位是更偏向软件的&#xff0c;或者说是软硬结合非常紧密的工作&#xff0c;那就是嵌入式开发工程师。 说起嵌入式&#xff0c;可能很多没有接触过电子类的人没有听说这些东西。 其实简单来说&#xff0c;嵌入式开发就是写程序去控制硬件电…

某城高速综合管控大数据大屏可视化【可视化项目案例-04】

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文选自专栏:可视化技术专栏100例 可视化技术专栏100例,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不…

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

Vue2&3组件自定义事件 和 解绑事件 Vue2组件自定义事件 功能&#xff1a;父组件绑定数据&#xff0c;子组件触发事件。&#xff08;父绑子触发&#xff09; 实现步骤&#xff08;前三步在父组件实现&#xff0c;第四步在子组件实现&#xff09;&#xff1a; 第一步&#…

【LeetCode刷题-二分查找】--162.寻找峰值

162.寻找峰值 方法一&#xff1a;寻找最大值 题目保证了nums[i]≠nums[i1]&#xff0c;所以数组nums中最大值两侧的元素一定严格小于最大值本身&#xff0c;因此最大值所在的位置就是一个可行的峰值位置 class Solution {public int findPeakElement(int[] nums) {int idx 0…