函数的命名空间及作用域

一、命名空间

1、定义

命名空间:名称到对象的映射,命名空间是通过字典来实现的,它的键就是变量名,它的值就是变量值。

2、分类

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

按照变量定义的位置,可以划分为以下3类,当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:

1)、Local,局部命名空间,

每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量。

2)、Global,全局命名空间,

每个模块加载执行时创建的,记录了模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量。

3)、Built-in,内置命名空间,

python自带的内建命名空间,任何模块均可以访问,放着内置的函数和异常。
4、如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name ‘aa’ is not defined。

4)创建顺序

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

5)销毁顺序

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

# 代码一
i=1
def func2():
    i=i+1
 
func2();
#错误:UnboundLocalError: local variable 'i' referenced before assignment

代码一:由于创建命名空间时,python会检查代码并填充局部命名空间。在python运行那行代码之前,就发现了对i的赋值,并把它添加到局部命名空间中。当函数执行时,python解释器认为i在局部命名空间中但没有值,所以会产生错误。

3、生命周期

Local(局部命名空间)在函数被调用时才被创建,但函数返回结果或抛出异常时被删除。(每一个递归函数都拥有自己的命名空间)
Global(全局命名空间)在模块被加载时创建,通常一直保留直到python解释器退出
Built-in(内建命名空间)在python解释器启动时创建,一直保留直到解释器退出

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

二、作用域

1、定义

作用域是针对变量而言,指申明的变量在程序里的可应用范围。或者称为变量的可见性。

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

命名空间定义了在某个作用域内变量名和绑定值之间的对应关系,命名空间是键值对的集合,变量名与值是一一对应关系。
作用域定义了命名空间中的变量能够在多大范围内起作用。
命名空间在python解释器中是以字典的形式存在的,是以一种可以看得见摸得着的实体存在的。
作用域是python解释器定义的一种规则,该规则确定了运行时变量查找的顺序,是一种形而上的虚的规定。

3、变量查找顺序

Python中的作用域 Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的。 当 Python 遇到一个变量的话他会按照这样的顺序进行搜索:
本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)

学习链接:
https://www.cnblogs.com/zhangxinhe/p/6963462.html
http://www.cnblogs.com/windlaughing/archive/2013/05/26/3100362.html
https://blog.csdn.net/geekleee/article/details/73555951

猜你喜欢

转载自blog.csdn.net/weixin_42484709/article/details/85031831