【Python】新手入门:变量的作用域是什么?有哪几种作用域?作用域的查找顺序是什么?

【Python】新手入门:变量的作用域是什么?有哪几种作用域?作用域的查找顺序是什么?在这里插入图片描述

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


🌵文章目录🌵

  • 💡一、变量的作用域是什么?
  • 📚二、变量的四种作用域
  • 🔧三、作用域的查找顺序
  • 💻四、实例演示和代码示例
  • 📚五、作用域与变量生命周期
  • 🚀六、举一反三:如何修改作用域中的变量
  • 📖七、总结与最佳实践
  • 🔥结语

💡一、变量的作用域是什么?

  在Python编程中,变量的作用域是一个非常重要的概念。简单来说,变量的作用域决定了变量在程序中的可见性和可访问性。换句话说,它决定了变量在哪些部分可以被引用和使用。

  变量的作用域可以分为四个级别:局部作用域、嵌套局部作用域、全局作用域和内置作用域。下面我们将详细解释这些作用域的概念和区别。

📚二、变量的四种作用域

  1. 局部作用域

    局部作用域也称为函数作用域,是变量在函数内部定义时的范围。在函数内部定义的变量只在该函数内部可见,当函数执行完毕后,这些变量就会被销毁。

    def my_function():
        local_var = "我在局部作用域内"
        print(local_var)
    
    my_function()  # 输出:我在局部作用域内
    # 尝试在函数外部访问 local_var 会导致 NameError
    # print(local_var)  # NameError: name 'local_var' is not defined
    
  2. 嵌套局部作用域

    嵌套局部作用域指的是在函数内部定义的另一个函数中的变量作用域。内部函数可以访问外部函数的局部变量,但外部函数无法直接访问内部函数的局部变量。

    def outer_function():
        outer_var = "我在外部函数作用域内"
        
        def inner_function():
            inner_var = "我在嵌套局部作用域内"
            print(outer_var)  # 可以访问外部函数的变量
            print(inner_var)
        
        inner_function()
    
    outer_function()  # 输出:我在外部函数作用域内,我在嵌套局部作用域内
    
  3. 全局作用域

    全局作用域是指在整个程序中都可见的变量作用域。在函数外部定义的变量属于全局作用域,它们可以在程序的任何地方被访问和修改(除非在函数内部被重新定义为局部变量)。

    global_var = "我在全局作用域内"
    
    def another_function():
        print(global_var)  # 可以访问全局变量
    
    another_function()  # 输出:我在全局作用域内
    
  4. 内置作用域

    内置作用域是Python解释器自带的变量作用域,它包含了所有内置函数和异常的名字。这些名字在程序任何地方都是可见的,但通常我们不会修改它们。

    例如,len()print()等内置函数就位于内置作用域中。

🔧三、作用域的查找顺序

  了解这四种作用域后,我们需要知道Python是如何在多个作用域中查找变量的。当我们在程序中引用一个变量时,Python会按照以下顺序进行查找:

  1. 局部作用域:首先在当前函数或方法内部查找变量。
  2. 嵌套局部作用域:如果当前函数内部还有嵌套函数,则继续在这些嵌套函数内部查找。
  3. 全局作用域:如果局部变量中未找到,则到全局变量中查找。
  4. 内置作用域:最后,如果全局变量中也未找到,则到内置作用域中查找。

这个查找顺序也被称为LEGB规则,即Local(局部)、Enclosing(嵌套局部)、Global(全局)、Built-in(内置)。

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

下面是一个综合了以上作用域的示例代码:

# 全局作用域
global_scope_var = "全局变量"

def outer_function():
    # 嵌套局部作用域(属于outer_function)
    nested_scope_var = "嵌套局部变量"
    
    def inner_function():
        # 局部作用域(属于inner_function)
        local_scope_var = "局部变量"
        
        # 访问嵌套局部作用域变量
        print(nested_scope_var)
        
        # 访问全局作用域变量
        print(global_scope_var)
        
        # 尝试访问内置作用域变量(例如len)
        print(len([1, 2, 3]))
        
        # 尝试访问不存在的变量会导致NameError
        # print(non_existent_var)  # NameError: name 'non_existent_var' is not defined
    
    inner_function()

outer_function()

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

  变量的生命周期与其作用域紧密相关。局部变量在函数被调用时创建,在函数返回时销毁。全局变量在程序开始时创建,在程序结束时销毁。了解变量的生命周期对于管理内存和避免潜在的错误(如引用已销毁的局部变量)至关重要。

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

  在Python中,变量的作用域不仅限定了变量的可见性,还影响了我们如何修改这些变量的值。了解如何在不同作用域中修改变量是编程中的一项重要技能。

  1. 修改局部变量

    局部变量是在函数内部定义的,因此它们只能在函数内部被修改。一旦函数执行完毕,这些变量的值就会丢失。

    def modify_local_variable():
        local_var = 10
        local_var += 5  # 修改局部变量
        print(local_var)  # 输出:15
    
    modify_local_variable()
    
  2. 修改全局变量

    在函数内部,如果你想修改全局变量,你需要使用global关键字来声明这个变量是全局的。否则,Python会将其视为一个新的局部变量。

    global_var = 20
    
    def modify_global_variable():
        global global_var  # 声明变量是全局的
        global_var += 10  # 修改全局变量
        print(global_var)  # 输出:30
    
    modify_global_variable()
    print(global_var)  # 输出:30,全局变量已被修改
    
  3. 避免在函数内部修改全局变量

    虽然可以在函数内部修改全局变量,但这通常不是一个好的做法。因为它可能导致代码难以理解和维护。更好的做法是通过参数传递变量到函数中,并在函数内部返回修改后的值。

    def modify_and_return_value(var):
        var += 5
        return var
    
    global_var = 25
    global_var = modify_and_return_value(global_var)
    print(global_var)  # 输出:30
    
  4. 嵌套作用域中的变量修改

    在嵌套函数中,内部函数可以访问外部函数的变量,但通常不建议直接修改外部函数的变量,因为这可能导致意外的副作用。如果确实需要修改,可以通过返回值或其他机制来实现。

    def outer_function():
        outer_var = 100
        
        def inner_function():
            nonlocal outer_var  # 声明变量是非局部的(在Python 3中)
            outer_var += 20    # 修改嵌套作用域中的变量
            return outer_var
        
        return inner_function()
    
    result = outer_function()
    print(result)  # 输出:120
    

    在Python 3中,nonlocal关键字用于指示一个变量引用最近的外层作用域的变量,而不是全局变量。

📖七、总结与最佳实践

  理解变量的作用域是编写高质量Python代码的关键。不同的作用域规则允许我们组织代码,使其更加清晰、可维护,并减少潜在的错误。最佳实践包括:

  • 尽量避免在函数内部修改全局变量,而是通过参数和返回值来传递和修改数据。
  • 在嵌套函数中,如果需要修改外部函数的变量,使用nonlocal(在Python 3中)来明确声明变量的作用域。
  • 对于复杂的程序,可以考虑使用类和对象来封装数据和行为,以更好地管理变量的作用域和生命周期。

通过遵循这些最佳实践,你可以编写出更加健壮、可读的Python代码。

🔥结语

  在Python编程中,变量的作用域是一个核心概念,它决定了变量在程序中的可见性和生命周期。通过理解局部作用域、全局作用域和内置作用域,以及如何在不同作用域中修改变量,你可以编写出更加高效、可维护的代码。希望这篇文章能够帮助你深入理解Python变量的作用域,并在实际编程中加以应用。如果你有任何疑问或建议,请随时在评论区留言,我们会尽快回复!

关键词: Python、变量作用域、局部变量、全局变量、内置变量、LEGB规则、作用域修改、最佳实践

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LinkedHashMap、HashSet、LinkedHashSet的源码剖析。

LinkedHashMap、HashSet、LinkedHashSet的源码剖析 1. LinkedHashMap2. HashSet3. LinkedHashSet LinkedHashMap、HashSet和LinkedHashSet都是Java中常用的集合类,下面分别剖析一下它们的源码看看。 1. LinkedHashMap LinkedHashMap继承自HashMap,通过维…

软考高级:信息系统建设原则概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

谷歌浏览器连接上WiFi之后无法正常浏览网站-报错:有一款应用正在组织Chrome安全连接到此网站

现象分析: 出现这个报错:(明明已经连接上家里的wifi却还是无法正常登录其他网站) 解决办法: 是因为电脑上加了网络代理,删除掉就好了 直接搜索:网络代理 把这2个位置记得清空,然…

守护Web安全:了解Web攻击与防护策略

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

对某旅行APP的检测以及参数计算分析【新手向-Simplesign篇】

简要概述: 目标so:scmain.so 讨论的生成过程:SimpleSign 使用工具:IDA pro 7.7、 Binary Ninja、Frida、Frida Stalker 本篇文章实现: SimpleSign的计算过程,包括前、中、后、变换四个主体阶段&#xf…

蓝桥杯刷题(二)

参考大佬代码:(区间合并二分) import os import sysn, L map(int, input().split()) # 输入n,len arr [list(map(int, input().split())) for _ in range(n)] # 输入Li,Si def check(Ti, arr, L)->bool:sec [] # 存入已打开的阀门在…

如何防御udp攻击

UDP Flood是互联网上最经典的DDoS(Distributed Denial of Service)攻击之一。攻击者在短时间内向目标设备发送大量的UDP报文,导致链路拥塞甚至网络瘫痪。一般的UDP报文由攻击工具伪造,通常在数据段具备相同的特征,另一…

从3V到12V,升压芯片该选哪个?

在电子系统设计中,升压芯片很重要,将直接影响到系统的稳定性、效率及噪声,特别是在需要将3V升到12V中,选择合适的升压芯片尤为关键,那么如何针对这个需求,合理选择升压芯片? 1、如何选择升压芯片…

阿里云服务器地域怎么选?速度、价格、备案、内网连接考虑因素

阿里云服务器地域选择方法,如何选择速度更快、网络延迟更低的地域节点,地域指云服务器所在的地理位置区域,地域以城市划分,如北京、杭州、深圳及上海等,如何选择地域?建议根据用户所在地区就近选择地域&…

三井住友保险中国区信息技术部负责人陈婧,将出席“ISIG-RPA超级自动化产业发展峰会”

3月16日,第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导,企智未来科技(RPA中国、AIGC开放社区、LowCode低码时代)主办。大会旨在聚合每一位产业成员的力量,深入探索R…

HNU-计算机网络-甘晴void学习感悟

前言 计算机网络其实我没太学懂, 仅从应试来说,考试成绩也不太好。 这也是为什么一直没有更新这一学科的学习感悟。 大三下还是有点闲,一周三天小长假,闲来无事还是给写了。 教材使用这本: 总领 期中考试 30% 期…

DeepLearning in Pytorch|我的第一个NN-共享单车预测

目录 概要 一、数据准备 导入数据 数据可视化 二、设计神经网络 版本一 版本二(正片) 三、测试 小结 概要 我的第一个深度学习神经网络模型---利用Pytorch设计人工神经网络对某地区租赁单车的使用情况进行预测 输入节点为1个,隐含…

RNN(Recurrent Neural Networks)循环神经网络

循环神经网络(Recurrent Neural Network,简称RNN)是一种处理序列数据的神经网络结构,它具有记忆能力,能够捕捉序列中的时序信息。RNN在自然语言处理、时间序列预测等方面有着很多的应用。 一、RNN 的基本结构 RNN的包…

数据结构 - 栈和队列

本篇博客将介绍栈和队列的定义以及实现。 1.栈的定义 栈是一种特殊的线性表,只允许在固定的一端进行插入和删除数据,插入数据的一端叫做栈顶,另一端叫做栈底。栈中的数据遵守后进先出的原则 LIFO (Last In First Out)。 插入数据的操作称为压…

设计模式-行为型模式-迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。[DP] 首先,定义一个接口Iterator,它包含了遍历聚合对象所需的方法: public interface Iterato…

spring boot 集成 mysql ,mybatisplus多数据源

1、需要的依赖&#xff0c;版本自行控制 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId> </dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java<…

python基础——输入与输出【input 和 print】

&#x1f4dd;前言&#xff1a; 上一篇文章python基础——入门必备知识中讲解了一些关于python的基础知识&#xff0c;可以让我们更好的理解程序代码中内容的含义&#xff0c;不至于一头雾水。今天我就来介绍一下&#xff0c;python中两个常见的输入和输出语句 input 和 print …

论文阅读之Multimodal Chain-of-Thought Reasoning in Language Models

文章目录 简介摘要引言多模态思维链推理的挑战多模态CoT框架多模态CoT模型架构细节编码模块融合模块解码模块 实验结果总结 简介 本文主要对2023一篇论文《Multimodal Chain-of-Thought Reasoning in Language Models》主要内容进行介绍。 摘要 大型语言模型&#xff08;LLM…

Dockerfile的使用,怎样制作镜像

Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build命令参数&#xff1a; --build-arg&#xff0c;设置构建时的变量 --no-cache&#xff0c;默认false。设置该选项&#xff0c;将不使用Build …

Ubuntu18/20运行ORB-SLAM3

ORB-SLAM3复现(ubuntu18/20) 文章目录 ORB-SLAM3复现(ubuntu18/20)1 坐标系与外参Intrinsic parameters2 内参Intrinsic parameters2.1 相机内参① 针孔模型Pinhole② KannalaBrandt8模型③ Rectified相机 2.2 IMU内参 3 VI标定—外参3.1 Visual calibration3.2 Inertial calib…