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

本文详细介绍了Python中变量的作用域概念,包括局部、嵌套局部、全局和内置作用域,以及查找顺序(LEGB)。此外,还讨论了变量的生命周期和如何在不同作用域中修改变量。学习这些有助于编写更清晰、可维护的代码。
摘要由CSDN通过智能技术生成

【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学习指南


如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

  • 34
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值