【Python系列】深入理解 Python 中的 `nonlocal` 关键字

news2025/1/23 12:20:05

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐: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 的使用场景

  1. 修改闭包中的变量:闭包是一种特殊的对象,它允许一个函数访问创建时的作用域中的变量。使用 nonlocal 可以在闭包的内层函数中修改这些变量。

  2. 实现迭代器和生成器:在编写迭代器或生成器时,我们经常需要在 __iter__next 方法中修改迭代状态。通过使用 nonlocal,我们可以在这些方法中修改外部函数中的迭代状态。

  3. 状态保持:在某些情况下,我们希望函数能够记住上一次调用的状态。通过使用 nonlocal,我们可以在函数内部维护状态变量,而不需要将它们作为参数在每次调用时传递。

3.nonlocal 的工作原理

在 Python 中,每个函数都有自己的命名空间,用于存储局部变量。当我们在一个函数内部定义另一个函数时,内部函数通常只能访问和修改自己的局部变量。但是,当我们使用 nonlocal 关键字声明一个变量时,Python 解释器会向上查找命名空间,直到找到匹配的变量。如果找到了,内部函数就可以访问和修改这个变量;如果没有找到,就会引发一个 UnboundLocalError 错误。

4.使用 nonlocal 的示例

下面是一个使用 nonlocal 的简单示例,展示了如何在嵌套函数中修改外部函数的局部变量:

def outer():
    counter = 0

    def inner():
        nonlocal counter  # 声明counter为非局部变量
        counter += 1

    for _ in range(5):
        inner()
    print(counter)  # 输出将是5

outer()

在这个例子中,inner 函数通过 nonlocal 关键字声明了 counter 变量,使其能够访问并修改 outer 函数中的 counter 变量。

5.与 global 的区别

global 关键字用于在函数内部声明一个变量为全局变量,即它指向的是全局作用域中的变量。而 nonlocal 用于声明一个变量为非局部变量,即它指向的是最近的非全局作用域中的变量。简而言之,global 用于全局作用域,而 nonlocal 用于局部作用域。

6.注意事项

  1. 避免过度使用:虽然 nonlocal 提供了修改外部作用域变量的能力,但过度使用可能会导致代码难以理解和维护。在可能的情况下,考虑使用返回值或参数传递来替代。

  2. 注意作用域链:在使用 nonlocal 时,要清楚地了解变量的作用域链。错误的使用可能会导致意外的修改或错误。

  3. 与类方法结合使用:在类的方法中使用 nonlocal 时,要注意 self 参数实际上是指向实例的引用,而不是一个局部变量。
    在这里插入图片描述

7.结论

nonlocal 是 Python 中一个强大的特性,它允许我们在嵌套函数中修改外部作用域的变量。通过本文的介绍,你应该对 nonlocal 有了更深入的理解。记住,合理使用 nonlocal 可以提高代码的灵活性和表达力,但也要注意其可能带来的复杂性和潜在的错误。在实际编程中,要根据具体情况权衡利弊,选择最合适的方法来实现功能。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

进程状态(二)----- linux 中具体的进程状态(上)

目录 前言1. R 状态2. S 状态3. D 状态 前言 继上一篇文章 进程状态(一)---- 运行,阻塞,挂起 介绍了操作系统都有的三个进程状态,而这篇文章则是将进程状态具象化,谈论具体到 linux 系统中的进程状态都有哪…

Geoserver源码解读七 插件(二)扩展图层预览界面

系列文章目录 Geoserver源码解读一 环境搭建 Geoserver源码解读二 主入口 Geoserver源码解读三 GeoServerBasePage Geoserver源码解读四 REST服务 Geoserver源码解读五 Catalog Geoserver源码解读六 插件(怎么在开发模式下使用) 目录 系列文章目录…

vector中 resize()和reserve()

1.resize()改变容器大小 resize除了预留内存以外,还会调用容器元素的构造函数,不仅分配了N个对象的内存,还会构造N个对象。从这个层面上来说,resize()在时间效率上是比reserve()低的。 2.reserve()容器大小管理 用于预留内存。 …

【Linux】shell命令与Linux权限的概念

目录 一、shell命令二、Linux权限的概念2.1 Linux权限的概念2.1.1 用户2.1.2 指令2.1.2.1 su指令2.1.2.2 sudo指令 2.2 Linux权限管理2.2.1 文件访问者的分类(人)2.2.2 文件类型和访问权限(事物属性)2.2.2.1 文件类型2.2.2.2 基本…

C++ 中迭代器的first和second

c 里面的map容器的迭代器里面 有个first 和 second&#xff0c;分别指向键值和数值 it.first就是在迭代器中获取map键值&#xff0c;it.second同理 #include<iostream> #include<map> using namespace std;int main(void){map<string, string> m;//新建一个m…

lower_bound函数和upper_bound函数

lower_bound 和 upper_bound 函数都是 C 标准库算法&#xff0c;用于在已排序的范围内查找元素。它们返回的是迭代器&#xff0c;指向满足特定条件的元素位置。 lower_bound(begin, end, val) 功能&#xff1a;返回指向第一个不小于 val 的元素的迭代器。含义&#xff1a;如果…

如何快速下载拼多多图片信息,效率高

图片是电商吸引顾客的关键因素&#xff0c;高质量的商品图片能提升产品吸引力&#xff0c;增强用户购买欲望。良好的视觉展示有助于建立品牌形象&#xff0c;提高转化率。同时&#xff0c;图片也是商品信息的主要传递媒介&#xff0c;对消费者决策过程至关重要。 使用图快下载器…

Linux内核有什么之块设备驱动有什么第七回 —— 邂逅的三个文件系统之二:实际文件系统(4)

接前一篇文章&#xff1a;Linux内核有什么之块设备驱动有什么第六回 —— 邂逅的三个文件系统之二&#xff1a;实际文件系统&#xff08;3&#xff09; 本文内容参考&#xff1a; 《Linux设备驱动开发详解 —— 基于最新的Linux4.0内核》 宋宝华&#xff0c;机械工业出版社 3…

奥运会大规模使用中国AI大模型!

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 AI圈最近又发生了啥新鲜事&#xff1f; 巴黎奥运会大规模使用中国 AI 大模型 巴黎奥运会成为一场科技与体育的盛宴&#xff0c;其中包括了大量中国科技的应用。AI 技术将在多个方面发挥作用&#xf…

《计算机网络》(第8版)第7章 网络安全 复习笔记

第 7 章 网络安全 一、网络安全问题概述 1 计算机网络面临的安全性威胁 计算机网络上的通信面临两大类威胁&#xff0c;即被动攻击和主动攻击。 &#xff08;1&#xff09;被动攻击 这是指攻击者从网络上窃听他人的通信内容&#xff0c;通常把这类攻击称为截获。 &#xff08…

2.外部中断(EXTI)

理论 NVIC&#xff1a;嵌套向量中断控制器&#xff08;解释教程&#xff09; 外部通用中断线(EXTI0~EXTI15)&#xff1a;每个GPIO设置成中断模式&#xff0c;与中断控制器连接的线 外部中断触发方式 上升沿触发、下降沿触发、双边沿触发 外部中断触发函数 在stm32f1xx_it.c文件…

【AI作图:奥运会游泳冠军】

画一个&#xff1a;水花&#xff0c;上半身&#xff0c;游泳冠军&#xff0c;泳池背景&#xff0c;面部明亮&#xff0c;眼神光&#xff0c;亚洲运动员&#xff0c;超高品质&#xff0c;真人&#xff0c;完美容颜&#xff0c;健美&#xff0c;健身&#xff0c;身材娇好&#xf…

Jackson常用注解详解

Hi &#x1f44b;, Im shy 有人见尘埃&#xff0c;有人见星辰 Jackson常用注解详解 文章目录 Jackson常用注解详解0. 引入依赖1. JsonProperty2. JsonIgnore3. JsonFormat4. JsonInclude5. JsonCreator6. JsonValue7. JsonIgnoreProperties结论 Jackson是Java生态系统中广泛…

例题:使用一条命令将xxx目录下除了xx子目录之外的文件全部删除(find、管道、grep、exec)

文章目录 例题&#xff1a;删除xx子目录以外的所有目录和文件需求方式一方式二 例题&#xff1a;删除xx子目录以外的所有目录和文件 需求 使用一条命令将/opt目录下除了rh子目录之外的文件全部删除 [rootlocalhost opt]# cp /var/log/vm* /opt/ [rootlocalhost opt]# mkdir …

(一)循环依赖,你真的懂了吗?万字解析循环依赖底层原理 - 什么是Bean循环依赖?Spring是如何解决的?二级缓存可以解决吗?遇到相关报错如何处理?

theme: vuepress 一、相关知识点简介 Spring Boot是基于Spring框架的一个快速开发平台&#xff0c;旨在简化Spring应用的创建和部署。通过提供一系列开箱即用的默认配置和自动化工具&#xff0c;Spring Boot使开发者能够专注于业务逻辑&#xff0c;而无需处理复杂的配置和依赖…

【Python机器学习】支持向量机——在复杂数据上应用核函数

上图中&#xff0c;数据中存在某种可以识别的模式&#xff0c;其中一个问题就是&#xff1a;我们能否想线性情况一样&#xff0c;利用强大的工具来捕捉数据中的这种模式&#xff1f; 利用核函数将数据映射到高维空间 在上图中&#xff0c;数据点处于一个圆中&#xff0c;人类…

《零散知识点 · 自定义 HandleMapping》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

[独家原创] CPO-RBF多特征分类预测 优化宽度+中心值+连接权值 (多输入单输出)Matlab代码

[独家原创] CPO-RBF多特征分类预测 优化宽度中心值连接权值 &#xff08;多输入单输出&#xff09;Matlab代码 目录 [独家原创] CPO-RBF多特征分类预测 优化宽度中心值连接权值 &#xff08;多输入单输出&#xff09;Matlab代码效果一览基本介绍程序设计参考资料 效果一览 基本…

算法--初阶

1、tips 1.1、set求交集 {1,2,3} & {2,3} & {1,2} {2} 其实就是位运算&#xff0c; 只有set可以这样使用&#xff0c; list没有这种用法 {1,2,3} | {2,3, 4} | {1,2} {1, 2, 3, 4} 并集 1.2、*与** * 序列(列表、元组)解包&#xff0c;如果是字典&#xff0c;那…

15.75.【C语言】表达式求值

目录 一.整型提升 1.定义 2. 一.整型提升 1.定义 C语言中整型算术运算总是至少以缺省&#xff08;默认&#xff09;整型类型的精度来进行的。为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升 2.整型提…