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

  • 作用域有哪几种

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

    名称绑定在一个代码块中,则为该代码块的局部变量,除非声明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
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值