命名空间与作用域

1.命名空间

【定义】

    它是存储作用域中变量的字典。一个命名空间中不能有重名,但是不同的命名空间可以重名而没有任何影响。

 

【分类】

    按照变量定义的位置,可以划分为以下3类:

    Local,局部命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量。使用locals()查看局部命名空间。返回的是字典

    Global,全局命名空间,记录了每个被加载模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量。使用globals()查看全局命名空间。返回的是字典

    Built-in,python的内建命名空间,任何模块均可以访问,放着内置的函数和异常。使用dir(__builtins__)查看,返回的是列表

 

【生命周期】

    Local(局部命名空间)在函数被调用时才被创建,但函数返回结果或抛出异常时被删除。(每一个递归函数都拥有自己的命名空间)。

    Global(全局命名空间)在模块被加载时创建,通常一直保留直到python解释器退出。

    Built-in(内建命名空间)在python解释器启动时创建,一直保留直到解释器退出。

   

    各命名空间创建顺序:python解释器启动 ->创建内建命名空间 -> import加载模块 -> 创建全局命名空间 ->函数被调用 ->创建局部命名空间

    各命名空间销毁顺序:函数调用结束 -> 销毁函数对应的局部命名空间 -> python虚拟机(解释器)退出 ->销毁全局命名空间 ->销毁内建命名空间

   python程序执行期间会有2个或3个活动的命名空间(函数调用时有3个,函数调用结束后2个)。

    python解释器加载阶段会创建出内建命名空间、模块的全局命名空间,局部命名空间是在运行阶段函数被调用时动态创建出来的,函数调用结束动态的销毁的。

 

2.作用域

【定义】

    作用域是针对变量而言,指变量在程序里的可应用范围。

 

【分类】

    只有函数、类、模块会产生作用域,代码块不会产生作用域。作用域按照变量的定义位置可以划分为4类:

    Local(函数内部)局部作用域

    Enclosing(嵌套函数的外层函数内部)嵌套作用域(闭包)

    Global(模块全局)全局作用域

    Built-in(内建)内建作用域

 

3、命名空间与作用域的关系

    命名空间定义了在某个作用域内变量名与值之间的对应关系,命名空间在python解释器中是以字典的形式存在的,是实际存在的。

    作用域定义了命名空间中的变量能够在多大范围内起作用,作用域是python解释器定义的一种确定运行时变量查找顺序的规则。

 

  【变量查找法则】

    python解释器动态执行过程中,对遇到的变量进行解释时,是按照一条固定的作用域链查找解释的,又称为LEGB法则

    其中L代表Local 局部作用域,E代表Enclosing 嵌套作用域,G代表Global 全局作用域,B代表Built-in 内建作用域。

    python解释器查找变量时,会按照顺序依次查找局部作用域,嵌套作用域,全局作用域,内建作用域,在任意一个作用域中找到变量则停止查找,所有作用域查找完成没有找到对应的变量,则抛出 NameError: name 'xxxx' is not defined的异常。   

    在局部作用域中,可以看到局部作用域、嵌套作用域、全局作用域、内建作用域中所有定义的变量。

    在全局作用域中,可以看到全局作用域、内建作用域中的所有定义的变量,无法看到局部作用域中的变量。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值