文章目录
命名空间
定义
Python的命名空间的本质是一个字典,用来记录变量名称和值。字典的key是变量的名称,字典的value对于的是变量的值。例如 {‘name’:’zs’,’age’:10}
命名空间一共分为三种:局部命名空间、全局命名空间、内置命名空间
局部空间:
每个函数都有自己的命名空间,叫做局部空间,它记录了函数的变量,包括函数的参数 和局部定义的变量
全局空间:
每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、 类、其它导入的模块。
内置名称空间:
任何模块均可访问它,它存放着内置的函数和异常。
1. 名称空间的访问
局部命名空间使用locals()函数来访问
def func(num1,num2):
a=1
return locals()
print(func(2,3)) # {'a': 1, 'num2': 3, 'num1': 2}
全局命名空间的访问使用globals()函数访问
a=10
def func(name,age):
num=2
func(2,3)
print(globals())
2.命名空间的加载顺序
内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)当函数返回结果或抛出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。
3.命名空间的查找顺序
先从局部命名空间中找,如果能找到则停止搜索,
如果找不到在去全局名称空间中查找,如果找到则停止搜索,
如果找不到则到内置名称空间中查找,如果找不到则报错。
如果下面的代码中,把全局命名空间中的id和局部命名空间中的id都注释掉的话,会打印<built-in function id>,id是内嵌命名空间中的id函数
id = 1
def func():
id = 2
print(id) # 2
func()
print(id) # 1
如果一开始就从全局命名空间中查找,就直接找全局命名空间中的内容,
如果找到则停止搜索,如果找不到,就向内置命名空间中查找。
如果查找到则返回内容。如果查不到就报错。
注意事项:
自己的变量名称不要和内置的变量名相同,否则不能使用内置命名空间中的函数功能。
作用域
定义
作用域指的是变量在程序中的可应用范围。
作用域按照变量的定义位置可以划分为4类即LEGB:
Local(函数内部)局部作用域。
Enclosing(嵌套函数的外层函数内部)嵌套作用域(闭包)。
Global(模块全局)全局作用域。
Built-in(内建)内建作用域。
a=10 # a变量声明在全局作用域
print(a)
def outter():
b=11 # b变量声明在局部作用域
def inner():
c=12 # c变量声明在嵌套作用域
print(c) # 访问嵌套作用域中的内容
print(b) # 访问局部作用域中的内容
print(a) # 访问全局作用域中的内容
print(c) # 超出c变量的作用域
print(a) # 访问全局作用域中的内容
print(c) # 超出c变量的作用域
print(b) # 超出b变量的作用域
print(a) # 访问全局作用域中的内容
注意:
在python中,模块(module),类(class)、函数(def、lambda)会产生新的作用域,其他代码块是不会产生作用域的,也就是说,类似条件判断(if……else)、循环语句(for x in data)、异常捕捉(try…catch)等的变量是可以全局使用的。
命名空间和作用域的关系
命名空间定义了在某个作用域内变量名和绑定值之间的对应关系,命名空间是键值对的集合,变量名与值是一一对应关系。作用域定义了命名空间中的变量能够在多大范围内起作用。