当前位置: 首页 > news >正文

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

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
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 = 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.注意事项

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

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

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

7.结论

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

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

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

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

img

相关文章:

【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 之上构建的企业级分布式多租户容器管理平台,提供简单易用的操作界面以及向导式操作方式,在降低用户使用容器调度平台学习成本的同时&#xff…...

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时代的效率提升 一&#xff0c…...

解锁PyCharm:破解依赖库导入之谜

解锁PyCharm:破解依赖库导入之谜 PyCharm作为Python开发者的强大IDE,提供了丰富的功能来简化开发流程。然而,在使用过程中,开发者可能会遇到导入依赖库时出现的错误。本文将深入探讨PyCharm中导入依赖库报错的问题,并…...

JSON-Viewer插件:json格式查看器

npm install vue-json-viewer 2&#xff0c;main.js 引入 import JsonViewer from vue-json-viewer Vue.use(JsonViewer) 3&#xff0c;组件里写入这个组件 <json-viewer:value"textSecond":expand-depth"5"copyableboxedsort></json-viewer…...

HDFS块信息异常,spark无法读取数据

背景&#xff1a;flume数据落盘到hdfs上时&#xff0c;正在写入的文件一般是以.log.tmp结尾的文件&#xff0c;当flume将文件关闭以后将变为&#xff1a;.log 结尾的文件。由于我们使用阿里云的服务器&#xff0c;经常会有个别节点挂掉(进程在&#xff0c;无法通信&#xff0c;…...

TCP协议概述

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。它由IETF的RFC 793定义&#xff0c;并在各种通信系统中广泛应用&#xff0c;为不同但互连的计算机通信网络的主计算机中的成对进程之…...

SpringSecurity-3(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)

SpringSecurity使用数据库数据完成认证 5 SpringSecurity使用数据库数据完成认证5.1 认证流程分析5.1.1 UsernamePasswordAuthenticationFilter5.1.2 AuthenticationManager5.1.3 AbstractUserDetailsAuthenticationProvider5.1.4 AbstractUserDetailsAuthenticationProvider中…...

英国AI大学排名

计算机学科英国Top10 “计算机科学与信息系统”学科除了最受关注的“计算机科学”专业&#xff0c;还包括了“人工智能”“软件工程”“计算机金融”等众多分支专业。 1.帝国理工学院 Imperial College London 单以计算机专业本科来讲&#xff0c;仅Computing这个专业&#x…...

渗透测试与高级攻防技术(二)网络安全技术的前沿探讨:渗透测试与高级攻防

文章目录 引言 第一章&#xff1a;入侵检测与防御系统&#xff08;IDS/IPS&#xff09;1.1 IDS与IPS的区别1.2 Cisco IDS/IPS系统 第二章&#xff1a;蜜罐技术2.1 蜜罐技术概述2.2 搭建蜜罐系统2.3 蜜罐技术的优缺点 第三章&#xff1a;社会工程攻击3.1 社会工程攻击概述3.2 社…...

Windows系统下安装mujoco环境的教程【原创】

在学习Mujoco仿真的过程中&#xff0c;我先前是在linux系统下进行的研究与学习&#xff0c;今天来试试看在windows系统中安装mujoco仿真环境。 先前在linux中的一些关于mujoco学习记录的博客&#xff1a;Mujoco仿真【xml文件的学习 3】_mujoco打开xml文件-CSDN博客 下面开始wi…...

【秋招笔试】2024-08-03-科大讯飞秋招笔试题(算法岗)-三语言题解(CPP/Python/Java)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍖 本次题目难度中等偏上,最后一题又是…...

2024华数杯数学建模竞赛选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;C<A<B&#xff0c;开放度&#xff1a;A<B<C。 综合评价来看 A题适合对机械臂和机器人运动学感兴趣的同学&#xff0c;尤其是有一定编程和优化算法基础的同学。不建议非相关专业同学选择。 B题挑战较大&#xff0…...

大模型的经典面试问题及答案

大语言模型&#xff08;LLM&#xff09;在人工智能中变得越来越重要&#xff0c;在各个行业都有应用。随着对大语言模型专业人才需求的增长&#xff0c;本文提供了一套全面的面试问题和答案&#xff0c;涵盖了基本概念、先进技术和实际应用。如果你正在为面试做准备&#xff0c…...

从驱动编译到数据传输:RK3588与FPGA的PCIe通信实战解析

1. RK3588与FPGA的PCIe通信基础 在嵌入式开发中&#xff0c;RK3588作为一款高性能处理器&#xff0c;与FPGA的协同工作越来越常见。PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;作为一种高速串行计算机扩展总线标准&#xff0c;能够提供高带宽、低延…...

【Squoosh CLI】谷歌开源命令行图片批量压缩工具实战指南

1. 为什么你需要Squoosh CLI&#xff1f; 每次打开设计稿文件夹看到几十张未压缩的图片时&#xff0c;我都忍不住头皮发麻。作为前端开发&#xff0c;我经历过太多因为图片体积过大导致的页面加载缓慢问题。直到发现了谷歌开源的Squoosh CLI工具&#xff0c;这个命令行神器彻底…...

本科生 AI 写论文天花板!Paperxie 智能写作:从选题到成稿全流程,零焦虑搞定毕业论文

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 一、写在前面&#xff1a;毕业论文&#xff0c;为什么成了本科生的 “年度噩梦”&#xff1f; 每年毕业季&#x…...

Go HTTP Server 性能分析与优化

Go HTTP Server 性能分析与优化 在当今高并发的互联网应用中&#xff0c;HTTP Server的性能直接决定了用户体验和系统稳定性。Go语言凭借其轻量级协程和高效的网络库&#xff0c;成为构建高性能HTTP服务的首选之一。即使使用Go&#xff0c;开发者仍需深入分析性能瓶颈并进行针…...

Flink学习笔记:窗口

简介 langchain中提供的chain链组件&#xff0c;能够帮助我门快速的实现各个组件的流水线式的调用&#xff0c;和模型的问答 Chain链的组成 根据查阅的资料&#xff0c;langchain的chain链结构如下&#xff1a; $$Input \rightarrow Prompt \rightarrow Model \rightarrow Outp…...

智能家居开发实战:用RxAndroidBle3实现多设备扫描与信号过滤(附完整Demo)

智能家居BLE开发进阶&#xff1a;RxAndroidBle3多设备扫描与动态过滤实战 在智能家居场景中&#xff0c;蓝牙低功耗&#xff08;BLE&#xff09;设备的高效扫描与筛选是构建稳定物联网系统的关键技术。本文将深入探讨如何利用RxAndroidBle3框架实现多设备并发扫描、动态信号过滤…...

【大语言模型基础(2)】自注意力与多头机制:QKV、缩放与因果掩码

文章目录摘要1. 为什么需要自注意力2. Q、K、V 到底是什么一个具体例子3. Attention 公式在干什么第一步&#xff1a;计算相似度第二步&#xff1a;做缩放第三步&#xff1a;softmax\mathrm{softmax}softmax 归一化第四步&#xff1a;对 ValueValueValue 做加权平均4. 为什么 G…...

基于RIME-CNN-LSSVM回归模型的优化与预测应用——以MATLAB环境为例

RIME-CNN-LSSVM回归 基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测(可以更换为分类/单、多变量时序预测/回归&#xff0c;前私我)&#xff0c;Matlab代码&#xff0c;可直接运行&#xff0c;适合小白新手 程序已经调试好&#xff0c;无需更改…...

别再只调包了!深入对比VGG16、ResNet等9大模型在农业病害识别上的实战表现(附数据集)

深度视觉模型在农业病害识别中的实战评测&#xff1a;从特征提取到部署优化的全流程解析 当一片叶子出现褐色斑点时&#xff0c;农民往往需要等待数天才能获得实验室检测结果——这种传统诊断方式的滞后性&#xff0c;每年造成全球约20-40%的农作物损失。计算机视觉技术的突破正…...

Video2X:用AI突破视频质量瓶颈的全栈解决方案

Video2X&#xff1a;用AI突破视频质量瓶颈的全栈解决方案 【免费下载链接】video2x A lossless video/GIF/image upscaler achieved with waifu2x, Anime4K, SRMD and RealSR. Started in Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/video…...