终于弄懂了Python变量的作用域:局部变量与全局变量

Python变量的作用域:局部变量与全局变量

在Python编程中,作用域指的是变量在程序中的可见性或访问范围。作用域的概念决定了变量可以在程序的哪些地方被访问和修改。理解变量的作用域,特别是局部变量和全局变量之间的差异,对编写清晰、易于维护的代码至关重要。

在函数编程中,我们常常会遇到两种类型的变量:局部变量全局变量。这两者在作用域、生命周期和访问范围上有显著的区别。在本节中,我们将重点讨论这两类变量的作用域,帮助大家理解如何合理使用它们。

1. 局部变量

局部变量是指在函数内部定义的变量。它们的作用域仅限于函数内部,在函数外部无法直接访问。每当一个函数被调用时,局部变量会被创建并初始化,当函数执行结束时,局部变量会随之销毁。

局部变量的作用范围非常有限,仅在其所在的函数内部有效。换句话说,局部变量只能在函数的代码块内被访问和修改,函数外部不能访问和更改这些变量。如果试图在函数外部引用局部变量,Python会抛出NameError错误。

局部变量的特点

  • 作用域:仅在定义它的函数内有效。
  • 生命周期:局部变量的生命周期从函数被调用开始,到函数执行完毕为止,一旦函数结束,它就会被销毁。
  • 访问:函数外部无法访问局部变量,必须在定义它的函数内部才能访问。

例如,下面的代码展示了局部变量的定义和作用域:

def add_income(income):total_income = 0  # total_income是局部变量total_income += income  # 修改局部变量print("当前收入总额:", total_income)add_income(5000)  # 调用函数,传递参数
# print(total_income)  # 这里会报错,无法访问局部变量

在上面的代码中,total_income是局部变量,它只在add_income函数内部有效。调用函数时,total_income变量被创建并使用,但当函数执行完毕后,total_income就不再存在,试图在函数外部访问它会导致错误。

2. 全局变量

全局变量是指在函数外部定义的变量,它的作用域不局限于某个函数,而是贯穿整个程序。全局变量可以在程序的任何位置访问,包括函数内和函数外。全局变量通常在程序开始时创建,并且在程序运行期间一直存在,直到程序结束。

全局变量的作用范围是整个程序,即它可以在所有函数中被访问和修改。与局部变量不同的是,函数内部可以直接访问全局变量。如果函数内部需要修改全局变量的值,则必须使用global关键字声明该变量为全局变量,否则Python会默认创建一个局部变量,导致全局变量不会受到影响。

全局变量的特点

  • 作用域:可以在整个程序中访问,不仅在函数内,也可以在函数外部使用。
  • 生命周期:全局变量从程序开始执行时创建,一直到程序结束时才被销毁。
  • 访问:全局变量可以在函数内外任意地方访问和修改。

下面是一个使用全局变量的示例:

total_income = 0  # total_income是全局变量def add_income(income):global total_income  # 声明total_income为全局变量total_income += income  # 修改全局变量print("当前收入总额:", total_income)add_income(5000)  # 调用函数,修改全局变量
print("总收入:", total_income)  # 访问并打印全局变量

在这个例子中,total_income是一个全局变量,函数add_income通过global关键字声明后可以访问并修改它。无论add_income函数执行多少次,total_income的值都会被更新,并且在函数外部也能访问到最新的值。

3. 局部变量与全局变量的区别

局部变量和全局变量的作用域和生命周期有显著的区别,理解它们之间的差异有助于在编程中做出更合理的决策。

  • 作用域

    • 局部变量:仅在定义它的函数内部有效,外部无法直接访问。
    • 全局变量:在整个程序中都可以访问,无论是函数内还是函数外。
  • 生命周期

    • 局部变量:只存在于函数调用期间,一旦函数结束,局部变量就被销毁。
    • 全局变量:从程序开始执行直到程序结束,都保持存在。
  • 访问范围

    • 局部变量:只能在定义它的函数内访问,其他地方无法访问。
    • 全局变量:可以在函数内外任何地方访问和修改。
  • 命名冲突

    • 局部变量:局部变量只在函数内有效,因此避免了与其他函数中的局部变量发生冲突。
    • 全局变量:全局变量在整个程序中都可访问,若程序中存在多个全局变量,可能会发生命名冲突,导致代码的可维护性降低。
4. 使用局部变量与全局变量的最佳实践

在实际编程中,局部变量和全局变量各有其适用场景。为了保持代码的可读性和可维护性,我们通常会遵循以下最佳实践:

  • 优先使用局部变量:局部变量的作用范围有限,不容易产生副作用,因此尽量在函数内部使用局部变量,以避免不必要的错误和混乱。局部变量也能帮助封装数据,避免外部程序修改函数内部的数据状态。

  • 避免滥用全局变量:虽然全局变量可以在程序中任何地方访问,但过度依赖全局变量会使得代码的可维护性和可扩展性变差。全局变量可能会导致命名冲突,增加代码的复杂度,并且难以追踪全局变量的变化。

  • 使用全局变量时明确声明:如果确实需要在函数内修改全局变量的值,应该使用global关键字进行显式声明,确保修改的是全局变量而不是局部变量。

通过合理使用局部变量和全局变量,我们能够有效管理数据的访问范围和生命周期,减少程序中的错误,并提高代码的可读性和可维护性。在函数设计中,应尽量保持数据的封装性,避免不必要的全局变量污染。

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

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

相关文章

wireshark演进之路——从GTK到Qt

Wireshark 自 1998 年诞生至今,已有超过26年的历史了。它最早由 Gerald Combs 创建,最初名为 Ethereal。2006 年,Ethereal 更名为 Wireshark,并继续发展成了全球领先且人尽皆知的网络协议分析工具,其GUI演变就是其中非…

【大数据学习 | HBASE高级】rowkey的设计,hbase的预分区和压缩

1. rowkey的设计 ​ RowKey可以是任意字符串,最大长度64KB,实际应用中一般为10~100bytes,字典顺序排序,rowkey的设计至关重要,会影响region分布,如果rowkey设计不合理还会出现region写热点等一系列问题。 …

JavaWeb后端开发案例——苍穹外卖day01

day1遇到问题: 1.前端界面打不开,把nginx.conf文件中localhost:80改成81即可 2.前后端联调时,前端登录没反应,application.yml中默认用的8080端口被占用,就改用了8081端口,修改的时候需要改两个地方&…

Centos7镜像下载与docker安装

注意: CentOS 7 已于2024年6月30日停止维护! 1、下载 由于 centos 7 已经停止维护,部分镜像网站移除了对centos 7的支持,这里找到了部分现在还可以使用的镜像网站 阿里云开源镜像站:https://mirrors.aliyun.com/cent…

科技云报到:数字化转型,从不确定性到确定性的关键路径

科技云报到原创。 数字化转型是VUCA时代最大的确定性。 如果说,过去是数字化转型的试验阶段,实施的是开荒动土、选种育苗,那么当前要进行的是精耕细作、植树造林,数字化转型已进入了由个别行业、个别场景的“点状应用”向各行各业…

AgentReview:基于 LLM Agents 模拟同行评审过程的框架

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…

如何查看电脑关机时间

要查看电脑的关机时间,可以按照以下步骤进行操作: 1. 打开事件查看器:按下键盘上的Windows键R键,然后在弹出的运行对话框中输入"eventvwr.msc",并按下Enter键。 2. 在事件查看器窗口中,单击左侧窗…

详解Gemini API的使用:在国内实现大模型对话与目标检测教程

摘要:本博客介绍了如何利用Gemini API实现多轮对话和图像目标检测识别功能,在Python中快速搭建自己的大模型完成实际任务。通过详细的步骤解析,介绍了如何申请Gemini API密钥,调用API、对话实现的代码,给出了上传图片识…

HashMap的put流程知道吗

HashMap 的 put 方法算是 HashMap 中比较核心的功能了,复杂程度高但是算法巧妙,同时在上一版本的基础之上优化了存储结构,从链表逐步进化成了红黑树,以满足存取性能上的需要。本文逐行分析了 put 方法的执行流程,重点放…

5. ARM_指令集

概述 分类 汇编中的符号: 指令:能够编译生成一条32位机器码,并且能被处理器识别和执行伪指令:本身不是指令,编译器可以将其替换成若干条指令伪操作:不会生成指令,只是在编译阶段告诉编译器怎…

uniapp的基本使用(easycom规范和条件编译)和uview组件的安装和使用

文章目录 1、uniapp1.uview组件安装2.uview-plus组件安装 2、条件编译3、easycom规范1.组件路径符合规范2.自定义easycom配置的示例 总结 1、uniapp UniApp的UI组件库,如TMUI、uViewUI、FirstUI、TuniaoUI、ThorUI等,这些组件库适用于Vue3和TypeScript&…

Vue 学习随笔系列十四 -- JavaScript巧妙用法

JavaScript巧妙用法 文章目录 JavaScript巧妙用法1、String.padStart 函数2、String.padEnd 函数3、tirm 函数3. Object.freeze 函数4. Object.fromEntries 函数5. Object.entries 函数6. Array.prototype.flat 函数 1、String.padStart 函数 在字符串前面进行填充 let temp …

docker运行ActiveMQ-Artemis

前言 artemis跟以前的ActiveMQ不是一个产品,原ActiveMQ改为ActiveMQ Classic, 现在的artemis是新开发的,和原来不兼容,全称:ActiveMQ Artemis 本位仅介绍单机简单部署使用,仅用于学习和本地测试使用 官网:…

商场试衣间惊现隐藏摄像头:小澄检测仪助力博主影子揭露

在信息时代,隐私安全如同一座需要时刻守护的堡垒。然而,近期公共场所出现的针孔摄像头事件,让这座堡垒遭受了严峻冲击。科普博主影子不会说谎近日发布视频,再度曝光隐藏在商场服装店试衣间的针孔摄像头,引发公众关注。…

【MATLAB仿真】基于matlab的圆形阵列的波束形成进行仿真

摘要 本文研究了基于圆形阵列的波束形成技术,并利用MATLAB对其进行仿真分析。圆形阵列波束形成在现代无线通信、雷达和声学等领域具有广泛的应用,能够有效提高信号的方向性和抗干扰能力。本文通过改变阵列半径及入射角,对波束图进行了仿真分…

遗传算法与深度学习实战(23)——利用遗传算法优化深度学习模型

遗传算法与深度学习实战(23)——利用遗传算法优化深度学习模型 0. 前言1. 神经进化2. 使用遗传算法作为深度学习优化器小结系列链接 0. 前言 神经进化涵盖了所有用于改进深度学习的进化算法。更具体地说,神经进化用来定义应用于深度学习的特…

AG32 FPGA部分简单开发

环境 Quartus 13.0(Quartus 不能使用Lite 版本,需要使用Full 版本)AGM SDKSupra(快捷方式在SDK目录下,具体路径为AgRV_pio\packages\tool-agrv_logic\bin) FPGA编程 在AG32芯片中,拥有异构双…

github使用基础

要通过终端绑定GitHub账号并进行文件传输,你需要使用Git和SSH密钥来实现安全连接和操作。以下是一个基本流程: 设置GitHub和SSH 检查Git安装 通过终端输入以下命令查看是否安装Git: bash 复制代码 git --version配置Git用户名和邮箱 bash …

hive修改表名、修改列名、修改分区

文章目录 一、修改表二、修改列三、修改分区 官网地址:https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-AlteringandDroppingTables 一、修改表 1、重命名表名 ALTER TABLE table_name RENAME TO new_table_name示例: 将user表…

告别复杂协作:Adobe XD的简化替代方案

Adobe XD是一款集成UI/UX设计和原型创建功能的设计平台。它允许用户进行网页、移动应用的设计,以及原型的绘制,并且能够将静态设计转化为动态的交互原型。尽管Adobe XD提供了这些功能,但它依赖于第三方插件,且插件库有限&#xff…