python变量作用的查找顺序以及可能出现的问题

本文详细介绍了Python编程中的作用域概念,包括局部作用域(L)、闭包作用域(E)、全局作用域(G)和内置作用域(B)。同时,阐述了变量查找顺序及可能出现的NameError和UnboundLocalError异常。通过实例解释了如何正确理解和使用变量的作用域,以避免编程中常见的错误。
  • 作用域有哪几种

    代码块的定义:模块、类、函数,交互式输入的每条命令,脚本文件,脚本命令

    名称绑定在一个代码块中,则为该代码块的局部变量,除非声明global或nonlocal ,如果名称绑定在模块中,则为全局变量(模块代码块的变量即为局部变量又为全局变量),如果一个变量在一个代码块中被使用但不是在其中定义,则为自由变量

    作用域定义了一个代码块中名称的可见性

    1. 有哪几种?

      • 局部作用域 Local 简称L
      • 闭包函数外的函数中的作用域 Enclosing 简称E
      • 全局作用域 global 简称 G
      • 内置作用域 Bulit-in 简称 B
    2. 变量在作用域的查找顺序

      当一个变量名被使用时,由离它最近的作用域来解析,一个在闭包中的变量,它的作用域的查找顺序为 L -> E ->G ->B

    3. 可能会出现的问题

      • 当一个名称完全找不到时,将会引发NameError异常
      def fun():
          print(name)
          
      fun()
      Traceback (most recent call last):
        File "D:\python\程序包\lib\code.py", line 90, in runcode
          exec(code, self.locals)
        File "<input>", line 1, in <module>
        File "<input>", line 2, in fun
      NameError: name 'name' is not defined
      
      
      • 当前作用域为函数作用域,某变量名指向一个局部变量,而此变量在被使用前尚未绑定到特定值,将会引发**UnboundLocalError**错误

        e.g.

        var = 100
        def func():
            var = var + 1 #此时使用var将var视为局部变量
            
        func()
        Traceback (most recent call last):
          File "D:\python\程序包\lib\code.py", line 90, in runcode
            exec(code, self.locals)
          File "<input>", line 1, in <module>
          File "<input>", line 2, in func
        UnboundLocalError: local variable 'var' referenced before assignment
        

        var = 100
        def func():
            print(var) #var = 1 var为局部变量 此时使用时 var尚未绑定特定值
            var =  1 
            
        func()
        Traceback (most recent call last):
          File "D:\python\程序包\lib\code.py", line 90, in runcode
            exec(code, self.locals)
          File "<input>", line 1, in <module>
          File "<input>", line 2, in func
        UnboundLocalError: local variable 'var' referenced before assignment
        
参考资源链接:[Python面试题集锦+答案:冲刺高薪职位](https://wenku.youkuaiyun.com/doc/2bpr11sefa?utm_source=wenku_answer2doc_content) 在Python中,变量作用域指的是变量可被访问的代码区域。理解作用域对编写可维护和错误少的代码至关重要。Python主要根据LEGB规则确定变量查找顺序,该规则是局部(local)、封闭(Enclosing)、全局(Global)和内置(Built-in)作用域的缩写。 局部作用域通常是指当前函数的作用域,包含在函数定义内的变量。封闭作用域指的是嵌套函数中外部函数的作用域。全局作用域是指模块级的变量,即定义在函数外部的变量。内置作用域包含Python解释器自带的变量和函数,如print()、open()等。 当程序查找一个变量时,Python会按照LEGB顺序在相应的局部、封闭、全局和内置作用域中依次查找。如果在这些作用域中都未找到所需的变量Python将抛出一个NameError异常。 在Python 3中,可以使用global关键字声明全局变量,而在函数内部使用nonlocal关键字来引用嵌套函数的变量。此外,Python的模块导入机制也与作用域紧密相关,因为导入模块时,模块中定义的所有变量都会成为全局作用域的一部分。 对于准备面试的程序员来说,掌握这些知识是非常必要的。如果你希望深入学习更多关于Python编程的细节,特别是作用域和名称解析等概念,我推荐《Python面试题集锦+答案:冲刺高薪职位》。这份资料不仅提供了一个全面的问题列表,涵盖了Python基础知识到高级主题,还通过实际面试题目的解析,帮助你巩固理论知识并了解如何在实际工作中应用这些知识。 参考资源链接:[Python面试题集锦+答案:冲刺高薪职位](https://wenku.youkuaiyun.com/doc/2bpr11sefa?utm_source=wenku_answer2doc_content)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值