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 = 0def inner():c += 1return creturn innerf = 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 cc += 1return creturn innerf = inc()
print(1, f())
print(2, f())# 报错原因:inner定义了global c,但是python全局中没有c变量
# 报错内容:NameError: name 'c' is not defined
def inc():global cc = 0 # 自由变量,局部变量def inner():global cc += 1return creturn innerf = 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 creturn innerf = inc()
print(1, f())
print(2, f())# 返回结果:1 1
# 返回结果:2 2
def a():nonlocal cc = 100
print(a())# 报错原因:nonlocal c不是本函数的c,只能向上一层函数找,但是在上一层就是global了,nonlocal不允许在global中使用。
# 报错内容:SyntaxError: no binding for nonlocal 'c' found
def inc():a = 1000 c = 0def inner():nonlocal cc += 1return creturn innerf = inc()
print(1, f())
print(2, f())# 此代码主要说明,a没有闭包,因为在嵌套函数inner中没有使用到a
def inc():a = 1000 c = 0def inner():nonlocal cc += 1return cdef t():nonlocal aprint(a)print(t.__closure__)return innerreturn tf = inc()
print(1, f())
print(2, f())# 此代码中,a和c都用到了闭包,因为函数inner用了c,函数t用了a
c = 0
def a():c = 1def b():c = 2def c():c = 3print(c)# 闭包遵循就近原则,此代码为例,如函数c的c变量注释掉,打印的c就是函数中的c,以此类推。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axios请求的问题

本来不想记录,但是实在没有办法,因为总是会出现post请求,后台接收不到数据的情况,还是记录一下如何的解决的比较好。 但是我使用export const addPsiPurOrder data > request.post(/psi/psiPurOrder/add, data); 下面是封装的代码。后台接…

幼教早教内容付费预约小程序的效果如何

很多家庭对孩子的重视程度很高,尤其加之如今激烈竞争的市场,孩子从小便需要各种提前教育,而相关教培企业也比较多,基于服务高需求度,线下教育与线上课程教育同样重要。 在实际经营中,幼教早教培训机构也面…

“富婆”通讯录——让你少奋斗50年

文章目录 一、项目需求分析二、通讯录各功能实现思路及代码准备工作2.1、打印一个菜单,提供用户选择功能2.2、添加联系人信息2.3、删除联系人信息2.4、查询联系人信息2.5、修改联系人信息2.6、显示所有联系人信息2.7、对所有联系人信息进行排序整理2.8、删除所有联系…

[极客大挑战 2019]BuyFlag 1(两种解法)

题目环境: FLAG NEED YOUR 100000000 MONEY flag需要你的100000000元 F12瞅瞅源代码: if (isset($_POST[password])){ $password $_POST[password]; if (is_numeric($password)) { echo "password cant be number" } elseif ($pas…

【MySQL】列属性

文章目录 CHAR和VARCHAR插入单行 INSERT INTO插入多行插入分层行 LAST_INSERT_IN()创建表复制 CREAT TABLE AS更新单行 UPDATE...SET更新多行在UPDATES中使用子查询【需着重复习】删除行 DELETE恢复数据库到原始状态 CHAR和VARCHAR CHAR(50):存储文本占5个字符&…

Git 命令详解

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 C技能系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream we…

【博士每天一篇文献-算法】Imposing Connectome-Derived Topology on an Echo State Network

阅读时间:2023-11-5 1 介绍 年份:2022 作者:Jacob Morra, Mark Daley 西部大学 期刊:2022 International Joint Conference on Neural Networks (IJCNN) 引用量:3 研究了果蝇连接图的拓扑结构对混沌时间序列预测中回…

MGA-WPA

作者未提供代码

YOLO目标检测——猫狗目标检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用:宠物识别、猫狗分类数据集说明:猫狗分类检测数据集,真实场景的高质量图片数据,数据场景丰富,含有猫和狗图片标签说明:使用lableimg标注软件标注,标注框质量高,含voc(xm…

【开源】基于Vue.js的智能停车场管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系统管理员功能1. 停车位模块2. 车辆模块3. 停车记录模块4. IC卡模块5. IC卡挂失模块 三、界面展示3.1 登录注册3.2 车辆模块3.3 停车位模块3.4 停车数据模块3.5 IC卡档案模块3.6 IC卡挂…

Spring Boot中使用Spring Data JPA访问MySQL

Spring Data JPA是Spring框架提供的用于简化JPA(Java Persistence API)开发的数据访问层框架。它通过提供一组便捷的API和工具,简化了对JPA数据访问的操作,同时也提供了一些额外的功能,比如动态查询、分页、排序等。 …

ThinkPHP图片处理之压缩图片大小,图片处理之图片水印(添加平铺文字水印,并设置文字之间的间距和文字的角度)

安装扩展 使用Composer安装图像处理类库 composer require topthink/think-image在对应的控制器内引入Image use think\Image;图片处理之压缩图片大小 public function upload(){$file request()->file(image);// 将前端传过来的图片移动到项目目录下$info $file->…