news 2026/4/18 8:00:19

python变量详解(四)___变量的作用域(局部变量、全局变量、非局部变量)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python变量详解(四)___变量的作用域(局部变量、全局变量、非局部变量)

零、时光宝盒🌻

https://blog.csdn.net/weixin_69553582 逆境清醒)

前段时间,我煮八宝粥,十几种材料。因为我妈不想吃太甜的,所以,我没有放冰糖,粥里只靠食物本身的甜度。我处理红枣时,特意从中间去核,保留红枣的完整性。煮好后,我妈吃了两碗,吃到了完整的红枣,我也吃到了。可奇怪的是,没有再加热搅拌,晚上装给我哥吃时,锅里找不到完整的红枣了。这种情况以前煮那么多次八宝粥都没有试过。

我好奇为什么一大锅粥,只有两个完整红枣,其他的连碎角都没看到,煮溶了?因为喜欢研究自己失败的原因,例如我酿酒,整个过程消毒完整,但有时会发生长霉点的情况,我分析过其中各种原因,想出加大酿酒酵母使用量来抵抗杂菌的办法,每次就算有不可控的意外发生,都能经过处理后顺利酿出糯米酒。例如蒸蛋糕,糕体里出现个别大的气孔,整体不够均匀绵密,是因为将处理好的蛋糕材料倒入模具时,没有震几下,入模具过程中产生的空气没有及时排出。。。。所以,我跟我妈唠叨整大锅粥为什么只有两个完整的红枣,其他都没有了,我说时不觉得话有什么问题,因为我是在研究失败原因,就跟我酿酒时说瓶子里有霉点一样。可是,我妈发脾气了,认为我是在说她吃了红枣。。。

这次教训告诉我,同一句话,不同心境的人会理解不同,言者无心,听者有意。如果我们不想家庭发生内耗,话,要小心说,特别是家处于不可控的异常环境下。完整红枣消失的原因,我最后猜测是这次红枣和以往不同,没有用很干的红枣,用了半干的枣,容易煮化了。我和妈吃到完整的红枣,是因为刚煮好就装出来吃,而锅里的红枣,因为整锅粥处于保温状态,等于继续焖煮,化了,而锅里有很多红豆桂圆等材料,粥体是枣红色的,化了的红枣融在粥里看不出来。

结案,除了烹饪经验+1外,和家里人沟通需要留意的经验也+1。

逆境清醒

2026.1.28

python变量详解(四)

___变量的作用域(局部变量、全局变量、非局部变量)

变量的作用域

变量的作用域指其可访问的范围。函数内定义的变量通常为局部变量,仅在函数内有效;全局变量则在整个程序中可用。

在Python中,

  • 局部变量:在函数内部定义,仅在函数内有效。
  • 全局变量:在函数外部或全局范围内声明的变量称为全局变量。在函数外部定义,整个程序可见。若需在函数内修改全局变量,需使用global关键字
  • 非局部变量(nonlocal):用于在嵌套函数中声明一个变量既不是局部变量,也不是全局变量,而是来自外层函数作用域的变量。它通常用于闭包或嵌套函数中,修改外层函数的变量值。

一、全局变量、局部变量

global_var = "Global" def my_func(): local_var = "Local" print(global_var) # 可访问全局变量 my_func() print(local_var) # 报错:局部变量无法在外部访问

在 Python 中,全局变量是指在整个程序范围内都可以访问的变量,通常定义在函数或类之外。若要在函数内部修改它,需要使用global关键字声明。

count = 0 # 全局变量 def increment(): global count count += 1

在Python中创建变量的示例。

我们将njbl1创建为变量,我们通过函数fruit()来观察变量njbl1的变化情况。

例1:创建一个全局变量,输出函数变量值

global njbl1 njbl1 = "Apple" def fruit(): print("我是放在篮子里的,代表函数变量值为:", njbl1) fruit()

运行结果:

我是放在篮子里的,代表函数变量值: Apple

例2:创建一个全局变量,输出函数内变量的值和函数外变量的值

global njbl1 njbl1 = "Apple" def fruit(): print("我是放在篮子里的,代表函数内变量值为:", njbl1) fruit() print("我是放在桌子上的,代表函数外变量的值:", njbl1)

当我们运行代码时,将输出:

我是放在篮子里的,代表函数内变量值为: Apple
我是放在桌子上的,代表函数外变量的值: Apple

例3:创建一个全局变量,在函数内更改njbl1的值,

在函数内将njbl1的值更改为"banana"

global njbl1 njbl1 = "Apple" def fruit(): njbl1 = "banana" print("我是放在篮子里的,代表函数内变量值为:", njbl1) fruit() print("我是放在桌子上的,代表函数外变量的值:", njbl1)

当我们运行代码时,将输出:

我是放在篮子里的,代表函数内变量值为: banana
我是放在桌子上的,代表函数外变量的值: Apple

在函数内部和外部打印的结果不相同,

为什么在函数内部做的修改没有带出来呢?因为没有在函数内声明变量njbl1是全局变量,所以,python把函数里面的修改当成局部变量修改,也就是python创建了一个njbl1的局部变量,在函数里面对这个局部变量的修改不会影响到函数外的njbl1变量值。

如果要通过函数修改全局变量njbl1的值怎么处理呢?请看下面这的例子。

例4:创建一个全局变量,在函数内更改njbl1的值,并且同时更改全局变量njbl1的值

在函数内将njbl1的值更改为"banana"

global njbl1 njbl1 = "Apple" def fruit(): global njbl1 njbl1 = "banana" print("我是放在篮子里的,代表函数内变量值为:", njbl1) fruit() print("我是放在桌子上的,代表函数外变量的值:", njbl1)

当我们运行代码时,将输出:

我是放在篮子里的,代表函数内变量值为: banana
我是放在桌子上的,代表函数外变量的值: banana

二、非局部变量

非局部变量的概念

在Python中,非局部变量(nonlocal)用于在嵌套函数中声明一个变量既不是局部变量,也不是全局变量,而是来自外层函数作用域的变量。

非局部变量通常用于闭包或嵌套函数中,用于未定义局部作用域的嵌套函数,修改外层函数的变量值。这意味着该变量既不能在局部范围内,也不能在全局范围内。

使用场景

当需要在嵌套函数中修改外层函数的变量时,若直接赋值会默认创建新的局部变量,此时需使用nonlocal明确声明变量来自外层作用域。

基本语法

def outer_function(): x = 10 # 外层函数的变量 def inner_function(): nonlocal x # 声明x为非局部变量 x = 20 # 修改外层函数的x inner_function() print(x) # 输出20

global的区别

  • global:声明变量为全局作用域(模块级)。
  • nonlocal:声明变量为外层函数作用域(非全局)。
def counter(): count = 0 def increment(): nonlocal count count += 1 return count return increment counter_fn = counter() print(counter_fn()) # 输出1 print(counter_fn()) # 输出2

注意事项

  • nonlocal变量必须在外层函数中已定义,否则会引发SyntaxError
  • 不能通过nonlocal引用全局变量,若需修改全局变量应使用global

错误示例

报错:x未在外层函数中定义

def outer(): def inner(): nonlocal x # 报错:x未在外层函数中定义 x = 10 inner()

创建非局部变量

让我们看一下如何在Python中创建非局部变量的示例。

我们使用nonlocal关键字创建非局部变量。

示例:创建一个非局部变量

njex1='逆境清醒' print("调用函数outer前变量的值:",njex1) def outer(): njex1 = "local本地变量" print("这是变量在外部函数outer中的值1(调用inner函数前):",njex1) def inner(): nonlocal njex1 njex1 = "nonlocal非局部变量" print("这是变量在内部函数inner的值:",njex1) inner() print("这是变量在外部函数outer中的值2(调用inner函数后):",njex1) outer() print("调用函数outer后变量的值:",njex1)

当我们运行代码时,将输出以下结果:

调用函数outer前变量的值: 逆境清醒
这是变量在外部函数outer中的值1(调用inner函数前): local本地变量
这是变量在内部函数inner的值: nonlocal非局部变量
这是变量在外部函数outer中的值2(调用inner函数后): nonlocal非局部变量
调用函数outer后变量的值: 逆境清醒


在上面的代码中,有一个嵌套函数inner()。

我们使用nonlocal关键字创建一个非局部变量。

注意:如果我们改变了非局部变量的值,这些改变就会出现在局部变量中。

从玲开始学python___python变量专辑
1、python变量详解(一)___什么是python的变量
https://blog.csdn.net/weixin_69553582/article/details/157438788
2、python变量详解(二)___python变量的命名规则、常见命名风格
https://blog.csdn.net/weixin_69553582/article/details/157438821
3、python变量详解(三)___变量的赋值(变量的赋值、变量的数据类型、变量的动态类型、多变量赋值、解包赋值、交换变量值)
https://blog.csdn.net/weixin_69553582/article/details/157438837
4、

python变量详解(四)___变量的作用域(局部变量、全局变量、非局部变量)

https://blog.csdn.net/weixin_69553582/article/details/157463275

5、

python变量详解(五)___跨模块变量使用方法

6、python变量详解(六)___私有变量
7、

python变量详解(七)___变量的共享与引用、删除变量

8、python变量详解(八)___变量的类型检查、返回变量所指的内存地址
9、python变量详解(九)___

推荐阅读:

​​

逆境清醒文章总目录表

​​​​​​

​​​​​​

​​​​​​

给照片换底色(python+opencv)猫十二分类基于大模型的虚拟数字人__虚拟主播实例

​​

​​

​​

计算机视觉__基本图像操作(显示、读取、保存)直方图(颜色直方图、灰度直方图)直方图均衡化(调节图像亮度、对比度)

​​

​​

​​

语音识别实战(python代码)(一)

人工智能基础篇

计算机视觉基础__图像特征

逆境清醒

​​

matplotlib 自带绘图样式效果展示速查(28种,全)

​​

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)

​​

​​

​​

立体多层玫瑰绘图源码__玫瑰花python 绘图源码集锦

Python 3D可视化(一)

让你的作品更出色——词云Word Cloud的制作方法(基于python,WordCloud,stylecloud)

​​

​​

​​

python Format()函数的用法___实例详解(一)(全,例多)___各种格式化替换,format对齐打印

用代码写出浪漫__合集(python、matplotlib、Matlab、java绘制爱心、玫瑰花、前端特效玫瑰、爱心)

python爱心源代码集锦(18款)

​​

​​

​​

Python中Print()函数的用法___实例详解(全,例多)

Python函数方法实例详解全集(更新中...)

《 Python List 列表全实例详解系列(一)》__系列总目录、列表概念

​​

​​

用代码过中秋,python海龟月饼你要不要尝一口?

python练习题目录

​​

​​

​​

草莓熊python turtle绘图(风车版)附源代码

​草莓熊python turtle绘图代码(玫瑰花版)附源代码

​草莓熊python绘图(春节版,圣诞倒数雪花版)附源代码

​​

​​

巴斯光年python turtle绘图__附源代码

皮卡丘python turtle海龟绘图(电力球版)附源代码

​​

​​

​​

Node.js (v19.1.0npm 8.19.3) vue.js安装配置教程(超详细)

色彩颜色对照表(一)(16进制、RGB、CMYK、HSV、中英文名)

2026年1月头条:三年内第二次,C# 被 TIOBE 指数评为年度编程语言。多家权威机构编程语言排行榜__薪酬状况

​​​

​​

​​

手机屏幕坏了____怎么把里面的资料导出(18种方法)

【CSDN云IDE】个人使用体验和建议(含超详细操作教程)(python、webGL方向)

查看jdk安装路径,在windows上实现多个java jdk的共存解决办法,安装java19后终端乱码的解决

​​

vue3 项目搭建教程(基于create-vue,vite,Vite + Vue)

​​

​​

​​

2023年春节祝福第二弹——送你一只守护兔,让它温暖每一个你【html5 css3】画会动的小兔子,炫酷充电,字体特

别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(4套)

SVG实例详解系列(一)(svg概述、位图和矢量图区别(图解)、SVG应用实例)

​​

​​

​​

【程序人生】卡塔尔世界杯元素python海龟绘图(附源代码),世界杯主题前端特效5个(附源码)HTML+CSS+svg绘制精美彩色闪灯圣诞树,HTML+CSS+Js实时新年时间倒数倒计时(附源代码)

2023春节祝福系列第一弹(上)(放飞祈福孔明灯,祝福大家身体健康)(附完整源代码及资源免费下载)

​​

​​

​​

tomcat11、tomcat10 安装配置(Windows环境)(详细图文)

Tomcat端口配置(详细)

Tomcat 启动闪退问题解决集(八大类详细)

逆境清醒

​​​

信息系统项目管理师专题

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 18:07:16

本站最全网络安全学习路线图(2026版详解版)

近期,大家在网上对于网络安全讨论比较多,想要学习的人也不少,但是需要学习哪些内容,按照什么顺序去学习呢?其实我们已经出国多版本的网络安全学习路线图,一直以来效果也比较不错,本次我们针对市…

作者头像 李华
网站建设 2026/4/17 18:52:37

Github Copilot使用指南

tab 自动补齐代码或者注释ctrl i 内联聊天根据你的要求生成代码agent能够使用执行命令行命令,但是Edit不能

作者头像 李华
网站建设 2026/4/16 8:10:26

MindSpore 大模型训练进阶:高效显存管理 + 增量式断点续训的实践

在千亿参数大模型(如 LLaMA-7B/13B)的训练场景中,显存瓶颈与训练中断恢复是两大核心痛点 —— 前者直接限制模型规模,后者会导致工业级训练的时间与算力成本翻倍。本次分享基于 MindSpore 的高阶训练特性,构建 “分层显…

作者头像 李华
网站建设 2026/3/28 9:06:35

Spring Boot 3 集成 Apache Calcite:多数据源查询的终极解决方案

熟悉 Spring Boot 3 的开发者,都知道它在简化开发流程、提高开发效率方面的出色表现吧!但是,在实际业务场景中,大家肯定都碰到过这样的棘手问题:订单数据存放在 MySQL 里,库存数据在 PostgreSQL 中&#xf…

作者头像 李华
网站建设 2026/4/16 22:42:29

海港城:踞守九龙之南,镌刻香港商业地标传奇

在九龙半岛南端的尖沙咀,与维多利亚港紧密相连,坐落着香港最大型的购物中心——海港城。它远不止是一个购物场所,更是一个融合了零售、餐饮、文化、艺术与海港景观的综合性商业地标。这里由海运大厦、海洋中心、海港新域及香港酒店商场等建筑…

作者头像 李华
网站建设 2026/4/18 6:19:01

12m客车车架结构设计及分析

第2章车身的总体设计 2.1车身的总体设计方案 本车型车身的设计方案为:一种三段式底架的长途大客车客车车身。他包括:底架、地板骨架、左侧骨架、右侧骨架、前围骨架、后围骨架和顶盖骨架七部分组成此款客车式车身的骨架结构如下:底架和地板骨架,前后围骨架&#xff…

作者头像 李华