【Python系列】深入理解 Python 中的 `nonlocal` 关键字
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
- 导航
- 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
- 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
- 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
- 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
- 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
- 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
- 1.什么是 `nonlocal`?
- 2.`nonlocal` 的使用场景
- 3.`nonlocal` 的工作原理
- 4.使用 `nonlocal` 的示例
- 5.与 `global` 的区别
- 6.注意事项
- 7.结论
在 Python 编程中,我们经常会遇到需要在嵌套函数中访问和修改外部作用域变量的情况。这时,nonlocal 关键字就发挥了它的作用。本文将详细探讨 nonlocal 的使用场景、工作原理以及一些实际应用示例,帮助读者更好地理解和运用这一特性。

1.什么是 nonlocal?
nonlocal 是 Python 中的一个关键字,用于在嵌套的函数中声明一个变量,使其指向外层(非全局)作用域中的变量。这意味着,当你在一个函数内部定义了另一个函数,并希望内层函数能够修改外层函数的局部变量时,就需要使用 nonlocal。
2.nonlocal 的使用场景
-
修改闭包中的变量:闭包是一种特殊的对象,它允许一个函数访问创建时的作用域中的变量。使用
nonlocal可以在闭包的内层函数中修改这些变量。 -
实现迭代器和生成器:在编写迭代器或生成器时,我们经常需要在
__iter__或next方法中修改迭代状态。通过使用nonlocal,我们可以在这些方法中修改外部函数中的迭代状态。 -
状态保持:在某些情况下,我们希望函数能够记住上一次调用的状态。通过使用
nonlocal,我们可以在函数内部维护状态变量,而不需要将它们作为参数在每次调用时传递。
3.nonlocal 的工作原理
在 Python 中,每个函数都有自己的命名空间,用于存储局部变量。当我们在一个函数内部定义另一个函数时,内部函数通常只能访问和修改自己的局部变量。但是,当我们使用 nonlocal 关键字声明一个变量时,Python 解释器会向上查找命名空间,直到找到匹配的变量。如果找到了,内部函数就可以访问和修改这个变量;如果没有找到,就会引发一个 UnboundLocalError 错误。
4.使用 nonlocal 的示例
下面是一个使用 nonlocal 的简单示例,展示了如何在嵌套函数中修改外部函数的局部变量:
def outer():counter = 0def inner():nonlocal counter # 声明counter为非局部变量counter += 1for _ in range(5):inner()print(counter) # 输出将是5outer()
在这个例子中,inner 函数通过 nonlocal 关键字声明了 counter 变量,使其能够访问并修改 outer 函数中的 counter 变量。
5.与 global 的区别
global 关键字用于在函数内部声明一个变量为全局变量,即它指向的是全局作用域中的变量。而 nonlocal 用于声明一个变量为非局部变量,即它指向的是最近的非全局作用域中的变量。简而言之,global 用于全局作用域,而 nonlocal 用于局部作用域。
6.注意事项
-
避免过度使用:虽然
nonlocal提供了修改外部作用域变量的能力,但过度使用可能会导致代码难以理解和维护。在可能的情况下,考虑使用返回值或参数传递来替代。 -
注意作用域链:在使用
nonlocal时,要清楚地了解变量的作用域链。错误的使用可能会导致意外的修改或错误。 -
与类方法结合使用:在类的方法中使用
nonlocal时,要注意self参数实际上是指向实例的引用,而不是一个局部变量。

7.结论
nonlocal 是 Python 中一个强大的特性,它允许我们在嵌套函数中修改外部作用域的变量。通过本文的介绍,你应该对 nonlocal 有了更深入的理解。记住,合理使用 nonlocal 可以提高代码的灵活性和表达力,但也要注意其可能带来的复杂性和潜在的错误。在实际编程中,要根据具体情况权衡利弊,选择最合适的方法来实现功能。
觉得有用的话点个赞
👍🏻呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
相关文章:
【Python系列】深入理解 Python 中的 `nonlocal` 关键字
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Flask目录结构路由重定向简单实例讲解——轻量级的 Python Web 框架
假设一个flask目录结构如下: my_flask_app/ │ ├── app.py ├── routes/ │ ├── __init__.py │ ├── ZhejiangProvince/ │ │ ├── __init__.py │ │ ├── la.py │ │ └── el.py │ ├── GuangdongProvince/ │ │ ├…...
破解PyCharm插件更新难题:让IDE焕发新生
破解PyCharm插件更新难题:让IDE焕发新生 PyCharm作为业界领先的集成开发环境(IDE),其丰富的插件生态是其强大功能的重要来源。然而,插件无法更新的问题可能会困扰许多用户,影响开发体验。本文将详细介绍如…...
cmake常用命令学习
1.include https://blog.csdn.net/qq_38410730/article/details/102677143 CmakeLists.txt才是cmake的正统文件,而.cmake文件是一个模块文件,可以被include到CMakeLists.txt中。 include指令一般用于语句的复用,也就是说,如果有…...
K8S可视化管理平台KubeSphere
什么是 KubeSphere ? KubeSphere 是一款开源项目,在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器管理平台,提供简单易用的操作界面以及向导式操作方式,在降低用户使用容器调度平台学习成本的同时ÿ…...
Bugku-CTF-聪明的php
pass a parameter and maybe the flag files filename is random :> 传递一个参数,可能标记文件的文件名是随机的: 于是传一下参,在原网页后面加上/?a1,发现网页出现了变化 3.传入参数,一般情况下是文件包含,或者命令执行&…...
【MySQL进阶】MySQL主从复制
目录 MySQL主从复制 概念 主从形式 一主多从 多主一从 双主复制 主从级联复制 主从复制原理 三个线程 两个日志文件 主从复制的主要工作模式 异步复制 半同步复制 全同步复制 MySQL主从复制 概念 MySQL主从复制是一种数据分布机制,允许从一个数据库服…...
本地部署文生图模型 Flux
本地部署文生图模型 Flux 0. 引言1. 本地部署1-1. 创建虚拟环境1-2. 安装依赖模块1-3. 创建 Web UI1-4. 启动 Web UI1-5. 访问 Web UI 0. 引言 2024年8月1日,blackforestlabs.ai发布了 FLUX.1 模型套件。 FLUX.1 文本到图像模型套件,该套件定义了文本到…...
谷粒商城实战笔记-127-全文检索-ElasticSearch-整合-测试复杂检索
文章目录 一,使用Elasticsearch的Java RESTHighLevel Client完成复杂的查询请求1. 创建检索请求 (SearchRequest)2. 构造检索条件 (SearchSourceBuilder)3. 执行检索 (SearchResponse)4. 处理解析结果5. 获取聚合信息 二,AI时代的效率提升 一,…...
解锁PyCharm:破解依赖库导入之谜
解锁PyCharm:破解依赖库导入之谜 PyCharm作为Python开发者的强大IDE,提供了丰富的功能来简化开发流程。然而,在使用过程中,开发者可能会遇到导入依赖库时出现的错误。本文将深入探讨PyCharm中导入依赖库报错的问题,并…...
JSON-Viewer插件:json格式查看器
npm install vue-json-viewer 2,main.js 引入 import JsonViewer from vue-json-viewer Vue.use(JsonViewer) 3,组件里写入这个组件 <json-viewer:value"textSecond":expand-depth"5"copyableboxedsort></json-viewer…...
HDFS块信息异常,spark无法读取数据
背景:flume数据落盘到hdfs上时,正在写入的文件一般是以.log.tmp结尾的文件,当flume将文件关闭以后将变为:.log 结尾的文件。由于我们使用阿里云的服务器,经常会有个别节点挂掉(进程在,无法通信,…...
TCP协议概述
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它由IETF的RFC 793定义,并在各种通信系统中广泛应用,为不同但互连的计算机通信网络的主计算机中的成对进程之…...
SpringSecurity-3(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)
SpringSecurity使用数据库数据完成认证 5 SpringSecurity使用数据库数据完成认证5.1 认证流程分析5.1.1 UsernamePasswordAuthenticationFilter5.1.2 AuthenticationManager5.1.3 AbstractUserDetailsAuthenticationProvider5.1.4 AbstractUserDetailsAuthenticationProvider中…...
英国AI大学排名
计算机学科英国Top10 “计算机科学与信息系统”学科除了最受关注的“计算机科学”专业,还包括了“人工智能”“软件工程”“计算机金融”等众多分支专业。 1.帝国理工学院 Imperial College London 单以计算机专业本科来讲,仅Computing这个专业&#x…...
渗透测试与高级攻防技术(二)网络安全技术的前沿探讨:渗透测试与高级攻防
文章目录 引言 第一章:入侵检测与防御系统(IDS/IPS)1.1 IDS与IPS的区别1.2 Cisco IDS/IPS系统 第二章:蜜罐技术2.1 蜜罐技术概述2.2 搭建蜜罐系统2.3 蜜罐技术的优缺点 第三章:社会工程攻击3.1 社会工程攻击概述3.2 社…...
Windows系统下安装mujoco环境的教程【原创】
在学习Mujoco仿真的过程中,我先前是在linux系统下进行的研究与学习,今天来试试看在windows系统中安装mujoco仿真环境。 先前在linux中的一些关于mujoco学习记录的博客:Mujoco仿真【xml文件的学习 3】_mujoco打开xml文件-CSDN博客 下面开始wi…...
【秋招笔试】2024-08-03-科大讯飞秋招笔试题(算法岗)-三语言题解(CPP/Python/Java)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍖 本次题目难度中等偏上,最后一题又是…...
2024华数杯数学建模竞赛选题建议+初步分析
提示:DS C君认为的难度:C<A<B,开放度:A<B<C。 综合评价来看 A题适合对机械臂和机器人运动学感兴趣的同学,尤其是有一定编程和优化算法基础的同学。不建议非相关专业同学选择。 B题挑战较大࿰…...
大模型的经典面试问题及答案
大语言模型(LLM)在人工智能中变得越来越重要,在各个行业都有应用。随着对大语言模型专业人才需求的增长,本文提供了一套全面的面试问题和答案,涵盖了基本概念、先进技术和实际应用。如果你正在为面试做准备,…...
西门子博图V16实战:5种工作模式机械手PLC程序全解析(附HMI组态文件)
西门子博图V16实战:5种工作模式机械手PLC程序全解析(附HMI组态文件) 在工业自动化领域,机械手控制系统一直是核心难点之一。如何实现多工作模式的灵活切换、确保信号互锁安全可靠,是每个PLC程序员必须掌握的技能。本文…...
Typora搭配PicGo实现Markdown图片自动上传到Gitee的保姆级教程
Typora与PicGo联动:打造Gitee图床自动化工作流 对于长期使用Markdown写作的技术博主和文档工程师来说,图片管理始终是个痛点。本地图片导致文档迁移困难,第三方图床存在失效风险,而手动上传又严重打断创作流程。这套基于TyporaPic…...
简单认识了解MSE
了解MSE 的应用场景在传统的网页开发中,前端处理视频的方式非常被动:给 video标签指定一个src,剩下的下载、缓冲、解码工作完全由浏览器底层“黑盒”接管,开发者几乎无法干预。MSE(Media Source Extensions,…...
7个效率倍增技巧:StarRailAssistant自动化工具解放崩坏星穹铁道玩家双手
7个效率倍增技巧:StarRailAssistant自动化工具解放崩坏星穹铁道玩家双手 【免费下载链接】StarRailAssistant 崩坏:星穹铁道自动化 | 崩坏:星穹铁道自动锄大地 | 崩坏:星穹铁道锄大地 | 自动锄大地 | 基于模拟按键 项目地址: ht…...
dupeguru重复文件查找终极指南:3种扫描模式与高效文件管理完全教程
dupeguru重复文件查找终极指南:3种扫描模式与高效文件管理完全教程 【免费下载链接】dupeguru Find duplicate files 项目地址: https://gitcode.com/gh_mirrors/du/dupeguru 你是否曾经因为电脑磁盘空间不足而烦恼?面对成千上万的文件࿰…...
STM32+FreeRTOS双分区开发避坑指南:Bootloader跳转前别忘了这行关键代码
STM32FreeRTOS双分区开发避坑指南:Bootloader跳转前别忘了这行关键代码 当你在STM32上实现BootloaderApp双分区架构时,是否遇到过这样的场景:Bootloader明明成功跳转到了应用程序,却在启动FreeRTOS调度器时突然崩溃?寄…...
foobar2000 DUI界面深度解析:foobox-cn技术架构与实战配置完整指南
foobar2000 DUI界面深度解析:foobox-cn技术架构与实战配置完整指南 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn foobox-cn是针对foobar2000播放器开发的现代化DUI(默认用户…...
突破B站字幕壁垒:BiliBiliCCSubtitle全流程解决方案
突破B站字幕壁垒:BiliBiliCCSubtitle全流程解决方案 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 副标题:解决跨平台字幕迁移难题 - 本地…...
ZYNQ7010核心板硬件设计实战——从原理图到PCB的工程化思考
1. 从零开始构建ZYNQ7010核心板 第一次接触ZYNQ7010这种集成了ARM处理器和FPGA的SoC芯片时,我既兴奋又忐忑。这种混合架构的芯片确实强大,但随之而来的硬件设计复杂度也让人头疼。特别是当看到官方推荐的8层甚至12层PCB方案时,作为个人开发者…...
Swin2SR权限控制系统搭建:从小白到部署的完整实战教程
Swin2SR权限控制系统搭建:从小白到部署的完整实战教程 1. 引言:从个人工具到团队服务的转变 你刚刚体验了Swin2SR的强大,一张模糊的老照片,几秒钟就变得清晰锐利,那种感觉就像给图片做了一次“数字近视手术”。但很快…...

