【Python】新手入门:全局变量和局部变量的概念、区别以及用法

【Python】新手入门:全局变量和局部变量的概念、区别以及用法

在这里插入图片描述

🌈 个人主页:高斯小哥
🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~
💡 创作高质量博文(平均质量分92+),分享更多关于深度学习、PyTorch、Python领域的优质内容!(希望得到您的关注~)


🌵文章目录🌵

  • 💡一、全局变量和局部变量的概念
  • 📚二、全局变量和局部变量的区别
  • 🔧三、全局变量和局部变量的用法
  • 💻四、实例演示和代码示例
  • 📚五、作用域与变量生命周期
  • 🚀六、举一反三:如何修改作用域中的变量
  • 📖七、总结与最佳实践
  • 🔥结语

💡一、全局变量和局部变量的概念

  在Python编程中,理解全局变量和局部变量的概念是编写高效、可维护代码的关键。全局变量和局部变量在作用域、生命周期以及使用方式上都有着显著的区别。

  • 全局变量

    • 定义在函数外部的变量,它在整个程序中都是可见的。
    • 一旦全局变量被定义,它就可以在整个程序中被访问和修改。
    • 全局变量的作用域是整个程序,它的生命周期也是整个程序的执行期间。
    # 这是一个全局变量
    global_var = 10def print_global_var():print(global_var)  # 在函数内部访问全局变量print_global_var()  # 输出:10
    
  • 局部变量

    • 定义在函数内部的变量,它只在函数执行期间存在。
    • 局部变量只在函数内部可见,并且当函数执行完毕后,它的值会被销毁。
    def define_local_var():# 这是一个局部变量local_var = 20print(local_var)  # 在函数内部访问局部变量define_local_var()  # 输出:20
    # print(local_var)  # 这会引发错误,因为local_var是局部变量,在函数外部不可见
    

📚二、全局变量和局部变量的区别


全局变量和局部变量之间的主要区别体现在作用域、生命周期以及使用方式上。

  1. 作用域:全局变量的作用域是整个程序,而局部变量的作用域仅限于定义它的函数内部。在函数内部,局部变量会覆盖同名的全局变量。

    global_var = 30def modify_var():# 这里定义了一个局部变量,与全局变量同名global_var = 40print("Inside function:", global_var)  # 输出:Inside function: 40modify_var()
    print("Outside function:", global_var)  # 输出:Outside function: 30
    

    在上面的例子中,虽然函数内部修改了global_var的值,但这只影响到了局部变量global_var,全局变量global_var的值并未改变。

  2. 生命周期:全局变量的生命周期是整个程序的执行期间,而局部变量的生命周期仅限于函数调用的过程中。当函数执行完毕后,局部变量就会被销毁。

  3. 使用方式:由于全局变量在整个程序中都是可见的,因此过度使用全局变量可能会导致代码难以理解和维护。而局部变量则更加局部化,更易于管理和控制。在编写函数时,应尽量使用局部变量来存储临时数据,以减少对全局状态的依赖。

🔧三、全局变量和局部变量的用法


在Python中,我们可以根据需要灵活地使用全局变量和局部变量。但需要注意的是,在函数内部修改全局变量时,需要使用global关键字来声明。

global_var = 50def modify_global_var():global global_var  # 声明要修改的是全局变量global_var = 60print("Inside function:", global_var)  # 输出:Inside function: 60modify_global_var()
print("Outside function:", global_var)  # 输出:Outside function: 60

在上面的例子中,我们在函数内部使用global关键字声明了global_var是全局变量,并修改了它的值。这样,在函数外部访问global_var时,就能看到修改后的值。

然而,过度依赖全局变量可能会使代码变得难以理解和维护。因此,在编写函数时,应尽量使用局部变量来存储临时数据,并通过返回值来传递结果。这样可以减少函数之间的耦合度,提高代码的可读性和可维护性。

💻四、实例演示和代码示例

下面是一个简单的例子,演示了全局变量和局部变量的使用场景。

# 定义一个全局变量
total_score = 0def add_score(score):# 定义一个局部变量local_score = scoreprint(f"Local score: {local_score}")# 修改全局变量global total_scoretotal_score += local_scoreprint(f"Total score: {total_score}")# 调用函数,传入分数
add_score(85)  # 输出:Local score: 85, Total score: 85
add_score(90)  # 输出:Local score: 90, Total score: 175# 在函数外部访问全局变量
print(f"Final total score: {total_score}")  # 输出:Final totalscore: 175

📚五、作用域与变量生命周期

  理解作用域和变量的生命周期对于编写健壮且高效的代码至关重要。作用域决定了变量的可见性,即变量在哪里可以被访问。而变量的生命周期则关系到变量的创建和销毁的时机。

  全局变量的作用域是整个程序,它们在程序开始执行时创建,并在程序结束时销毁。这意味着全局变量在程序的整个生命周期内都是可用的。然而,这也带来了一个问题:过度使用全局变量可能导致代码难以维护和理解,因为任何函数都可能修改全局变量的值。

  局部变量的作用域则仅限于定义它的函数内部。当函数被调用时,局部变量被创建;当函数执行完毕并返回时,局部变量被销毁。这种局部性使得局部变量更加易于管理和控制,因为它们不会影响到程序的其他部分。

🚀六、举一反三:如何修改作用域中的变量

  在Python中,修改作用域中的变量需要一些特殊的技巧。对于局部变量,我们只需要直接赋值即可。但对于全局变量,我们需要使用global关键字来声明我们想要修改的是全局变量,而不是创建一个新的局部变量。

global_var = 100def modify_global():global global_var  # 声明我们要修改的是全局变量global_var = 200  # 修改全局变量的值modify_global()
print(global_var)  # 输出:200

在嵌套函数中,我们还需要注意变量的作用域链。内层函数可以访问外层函数的局部变量,但不能直接修改它们。如果需要修改外层函数的变量,通常可以通过返回值或者使用nonlocal关键字来实现。

def outer_function():outer_var = 10def inner_function():nonlocal outer_var  # 声明我们要修改的是外层函数的局部变量outer_var = 20inner_function()return outer_varresult = outer_function()
print(result)  # 输出:20

📖七、总结与最佳实践

  全局变量和局部变量是Python编程中的基础概念,理解它们的作用域、生命周期以及使用方式对于编写高质量的代码至关重要。在使用这些变量时,我们需要遵循一些最佳实践:

  1. 尽量避免使用全局变量:全局变量可能导致代码难以理解和维护。在可能的情况下,应尽量使用局部变量和参数传递数据。
  2. 明确变量的作用域:在编写函数时,应明确变量的作用域,避免在函数内部意外地修改全局变量。
  3. 使用globalnonlocal关键字:当需要在函数内部修改全局变量或外层函数的局部变量时,应使用globalnonlocal关键字来明确声明。
  4. 通过返回值传递结果:函数应尽量通过返回值来传递计算结果,而不是依赖于全局变量的修改。

通过遵循这些最佳实践,我们可以编写出更加健壮、易于维护和理解的Python代码。

🔥结语

  全局变量和局部变量是Python编程中不可或缺的概念。通过深入理解它们的作用域、生命周期以及使用方式,我们可以编写出更加高效、可维护的代码。希望本文能够帮助你更好地掌握这两个概念,并在实际编程中灵活运用。如果你有任何疑问或建议,请随时在评论区留言,我们会尽快回复。

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

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

相关文章

ABC 344

ABC 344 ABC用python写代码会比较快 A 题可以积累简洁的写法&#xff1a; S input() a, b, c S.split(|) print(ac)#include<bits/stdc.h> using namespace std; int main(){string s;cin >> s;int x s.find("|"); // The first occurrence of | w…

登录凭证------

为什么需要登录凭证&#xff1f; web开发中&#xff0c;我们使用的协议http是无状态协议&#xff0c;http每次请求都是一个单独的请求&#xff0c;和之前的请求没有关系&#xff0c;服务器就不知道上一步你做了什么操作&#xff0c;我们需要一个办法证明我没登录过 制作登录凭…

有源电桥电路

有源电桥电路 有源电桥由A3运放的正向输入端与负向输入端电压相等且为零可知&#xff1a;G点&#xff08;待测阻抗Zx与被测阻抗Rs的连接点&#xff09;电平一直为零&#xff0c;也就是平衡点虚地点&#xff0c;Ux与Us也就变成参照虚地点的绝对相量电压。并且根据运放的虚断原理…

FFmpeg——开源的开源的跨平台音视频处理框架简介

引言&#xff1a; FFmpeg是一个开源的跨平台音视频处理框架&#xff0c;可以处理多种音视频格式。它由Fabrice Bellard于2000年创建&#xff0c;最初是一个只包括解码器的项目。后来&#xff0c;很多开发者参与其中&#xff0c;为FFmpeg增加了多种新的功能&#xff0c;例如编码…

U盘秒变“零字节”?数据恢复全攻略!

一、遭遇U盘“零字节”危机 在数字化时代的浪潮中&#xff0c;U盘凭借其便携性和大容量&#xff0c;早已成为我们工作和生活中不可或缺的数据存储工具。然而&#xff0c;有时我们可能会突然遭遇一个令人头疼的问题——U盘显示0字节。明明前一天还存满了重要的文件&#xff0c;…

Android视角看鸿蒙第四课(module.json中的各字段含义之descriptionmainElement)修改程序入口

Android视角看鸿蒙第三课(module.json中的各字段含义之description&mainElement) 前言 上编文章了解了module.json中的name和type两个字段的含义及变更字段需要注意的事项&#xff0c;也明白了如何去实现类似Android library的功能。 这篇文章继续了解module.json中的des…

指针总结及例题总结

1 定义 指针是用来存放地址的变量 不同类型的指针变量所占用的存储空间是相同的&#xff0c;sizeof(int)sizeof(char)sizeof(double)... *是解引用操作符&#xff0c;&是取地址操作符&#xff0c;两者有着抵消作用 int a20;int* p&a;*p*&a20; 2&#xff0c;…

【C++11】包装器和bind

文章目录 一. 为什么要有包装器&#xff1f;二. 什么是包装器&#xff1f;三. 包装器的使用四. bind 函数模板1. 为什么要有 bind &#xff1f;2. 什么是 bind ?3. bind 的使用场景 一. 为什么要有包装器&#xff1f; function 包装器&#xff0c;也叫作适配器。C 中的 funct…

Vue.js计算属性:实现数据驱动的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

RESTful API学习

RESTful API REST&#xff08;英文&#xff1a;Representational State Transfer&#xff0c;简称REST&#xff0c;直译过来表现层状态转换&#xff09;是一种软件架构风格、设计风格&#xff0c;而不是标准&#xff0c;只是提供了一组设计原则和约束条件。它主要用于客户端和…

光伏数字化管理平台:驱动绿色能源革命的智能化引擎

随着全球对可再生能源需求的不断增长&#xff0c;光伏产业已经成为推动绿色能源革命的重要力量。在这个背景下&#xff0c;光伏数字化管理平台应运而生&#xff0c;以其强大的数据处理、实时监控和智能优化功能&#xff0c;为光伏电站的运营管理和维护带来了革命性的变革。 光伏…

储能系统--户用储能美洲市场(三)

2、美洲市场 2.1、美国户储发展驱动力 &#xff08;1&#xff09;电网老化带来配储需求&#xff0c;户用光储成家庭第二用电保障 美国大部分电网建于20世纪60和70年代&#xff0c;超70%以上的输电系统已经超过了25年&#xff0c;在高负荷运转或者外部环境承压时&#xff0c;…

深入理解Hive:探索不同的表类型及其应用场景

文章目录 1. 引言2. Hive表类型概览2.1 按照数据存储位置2.2 按照数据管理方式2.3 按照查询优化2.4 按照数据的临时性和持久性 3. 写在最后 1. 引言 在大数据时代&#xff0c;Hive作为一种数据仓库工具&#xff0c;为我们提供了强大的数据存储和查询能力。了解Hive的不同表类型…

【数学建模】层次分析

1.建立递阶层次结构模型 2.构造出各层次中的所有判断矩阵 对指标的重要性进行两两比较&#xff0c;构造判断矩阵&#xff0c;科学求出权重 矩阵中元素aij的意义是&#xff0c;第i个指标相对第j个指标的重要程度 对角线1&#xff0c;aijaji1 矛盾——>一致性检验

网络安全:OpenEuler 部署 jumpserver 堡垒机

目录 一、实验 1.环境 2.OpenEuler 部署 jumpserver 堡垒机 3.OpenEuler 使用 jumpserver 堡垒机&#xff08;管理Linux&#xff09; 4.OpenEuler 使用 jumpserver 堡垒机&#xff08;管理Windows&#xff09; 二、问题 1.jumpserver 安装报错 一、实验 1.环境 &#x…

【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表

文章目录 题目思路解答 题目 简单 相关标签 相关企业 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入…

【Linux】shell理解及linux权限解读(“花花公子Root”的自由人生)

目录 1.shell外壳理解 1.1 什么是shell外壳&#xff1a; 1.2 为什么存在shell外壳程序&#xff1a; 1.3外壳程序的具体工作阶段是怎么样的&#xff1f;&#xff08;招实习生&#xff0c;工作失败也不影响公司&#xff09; 2.linux下的权限的概念 2.1linux的用户 2.2.文件类型和…

“每一次的感应,都是对环境的温柔拥抱。”#STM32项目二 《感应开关盖垃圾桶》【下】

“每一次的感应&#xff0c;都是对环境的温柔拥抱。”#STM32项目二 《感应开关盖垃圾桶》【下】 前言预备知识1.实现距离感应开盖1.1换另一个定时器进行PWM输出驱动SG90舵机1.2延用超声波传感器介绍及实战工程进行配置PWM输出1.3在主C文件合适位置封装开关盖&#xff0c;开关LE…

Understanding Vulkan Objects

​ 和学习其他API一样&#xff0c;学习Vulkan API中有一个重要部分&#xff1a;了解Vulkan API定义了拿下类型&#xff0c;以及这些类型之间的关系。为了帮助理解这些类型&#xff0c;接下来会绘制一幅关系图&#xff0c;表现它们之间的关系&#xff0c;尤其是创建依赖关系。 …

map和set(二)——AVL树的简单实现

引入 二叉搜索树有其自身的缺陷&#xff0c;假如往树中 插入的元素有序或者接近有序&#xff0c;二叉搜索树就会退化成单支树&#xff0c;时间复杂度会退化成O(N)&#xff0c;因此 map、set等关联式容器的底层结构是对二叉树进行了平衡处理&#xff0c;即采用平衡树来实现。简…