Python命名空间namespace及作用域原理解析

1. Python命名空间

在Python中,每个变量都有其所属的命名空间,命名空间其实就是保存变量名与对象之间对应关系的一个系统。Python最常见的命名空间有以下几种:

1.1 内置命名空间

内置命名空间是在Python解释器启动时就加载到内存中的,其中包含了一些内置函数和模块,这些在Python解释器中始终可用。

import builtins

print(dir(builtins))

dir() 函数可以列出内置命名空间中的所有变量名。

1.2 全局命名空间

全局命名空间是在Python模块被导入时创建的,它保存了当前模块中定义的所有函数和变量,只有在当前模块中才能直接访问这些函数和变量。

a = 1

def func():

print(a)

func()

在函数外定义的变量 a 属于全局命名空间,因此函数内部直接可以使用。

1.3 局部命名空间

局部命名空间是在函数被调用时创建的,它保存了函数中定义的所有函数和变量,只有在函数内部才能直接访问这些函数和变量。

def func():

b = 2

print(b)

func()

在函数内部定义的变量 b 属于局部命名空间,因此函数外部无法直接访问。

2. 命名空间和作用域

命名空间和作用域是Python中两个非常重要的概念。

2.1 作用域

作用域是Python中一个限定变量名访问范围的定义域。Python中有三种作用域:

全局作用域

局部作用域

内置作用域

作用域中变量名的访问遵循 L-E-G-B 规则,即:

尝试在当前作用域内查找变量名

尝试在上一级作用域内查找变量名,直到找到为止

如果在全局作用域和内置作用域仍然找不到,则抛出 NameError 异常

2.2 命名空间

命名空间是Python中一个保存变量名与对象之间对应关系的系统。基本上,命名空间就是储存变量名的容器。

在Python中,每个命名空间都有其自己的作用域。简单来说,作用域决定了哪些命名空间可以访问哪些变量名。

Python中的命名空间有四种不同的类型:

局部命名空间

全局命名空间

内置命名空间

对象命名空间

Python中的每个对象都有一个对象命名空间,用于存储特定对象的属性和方法。

3. 命名空间和作用域的应用

命名空间和作用域是Python中非常重要的概念,他们直接影响着代码的编写和调试。下面给出一些应用例子。

3.1 全局变量和局部变量

全局变量定义在模块级别,可以被模块内部的所有函数直接访问。而在函数内部定义的变量属于函数的局部变量,只有在函数内部可以被访问。

a = 1  # 全局变量

def func():

b = 2 # 局部变量

print(a + b)

func()

3.2 命名空间的增删改查

可以使用 Python 内置的 globals() 和 locals() 函数查看全局和局部命名空间中的变量名。

a = 1  # 全局变量

def func():

b = 2 # 局部变量

print(globals()) # 查看全局命名空间

print(locals()) # 查看局部命名空间

func()

由于内置命名空间无法直接访问,所以要查看内置命名空间中的变量名需要先导入 builtins 模块。

import builtins

print(dir(builtins)) # 查看内置命名空间

可以使用 del 关键字删除一个变量名。

a = 1  # 全局变量

def func():

del a

print(a)

func()

可以使用 setattr 函数将一个值赋值给一个命名空间中的变量名。

def func():

locals()['a'] = 1

print(a)

func()

可以使用 hasattr 函数检查一个命名空间中是否存在指定的变量名。

a = 1  # 全局变量

def func():

if hasattr(globals(), 'a'):

print('a exists in global namespace')

else:

print('a does not exist in global namespace')

func()

3.3 嵌套函数以及nonlocal关键字

在Python中可以在一个函数内定义另一个函数,这个称为嵌套函数。在嵌套函数中,内部函数可以访问外部函数的局部变量和参数。

def outer():

a = 1

def inner():

nonlocal a

a += 1

print(a)

inner()

outer()

如果要在内部函数中修改外部函数的局部变量,需要使用 nonlocal 关键字。

4. 总结

本文详细介绍了Python中的命名空间和作用域。命名空间是Python中保存变量名和对象之间对应关系的一种系统,Python中有多种不同类型的命名空间。作用域是Python中一个限定变量名访问范围的定义域,Python中有三种不同的作用域。这些概念可以帮助我们更好的理解Python中的变量名和函数调用。同时,本文还给出了一些实际应用的例子,如全局变量和局部变量、嵌套函数以及nonlocal关键字等。希望能够对大家更好的理解Python中的命名空间和作用域有所帮助。

后端开发标签