在Python中,命名空间(Namespace)和作用域(Scope)是理解变量如何存储和访问的关键概念。本文小编与大家分享 Python 命名空间和作用域的相关知识。
一、命名空间
(一)命名空间的概念
在Python中,命名空间(Namespace,或称名称空间)是一个非常重要的概念,它是Python 用来存储变量名和对象引用的一个映射表,大部分的命名空间都是通过 Python 字典来实现的。每个名称空间都是一个字典的实例,从而可以通过变量名来访问对象。
大家可以将命名空间理解为类似计算机文件夹的结构,一个文件夹中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

(二)命名空间的分类
命名空间主要包含三种类型:
内置命名空间(built-in names), Python 语言内置的名称,比如函数名(len、 hasattr) 和 异常(NameError、SyntaxError)等等。
全局命名空间(global names),模块中定义的名称,包括函数、类、其它导入的模块、模块级的变量和常量。
局部命名空间(local names),函数中定义的名称,包括函数的参数和局部定义的变量。类中定义的也是。
(三)命名空间的加载
Python 命名空间的加载顺序依据以下顺序:
(1)内置命名空间:在程序运行前加载。
(2)全局命名空间:在程序运行时,从上到下加载。
(3)局部命名空间:在函数调用时加载。

二、作用域
在 Python 中,作用域(Scope)是指程序中定义的变量、函数和对象的可见性和可访问性范围。作用域规定了在程序中的哪些部分可以引用某个标识符(如变量名),以及在何处可以访问和操作这些标识符。
作用域的主要目的是确保变量和标识符的命名不会冲突,并且可以防止变量被意外地修改或访问,不但提供了封装和信息隐藏的机制,也有助于组织和管理程序的结构。
Python 作用域分为四类,由内向外嵌套:
局部作用域(Local):函数内部定义的变量,仅函数内可访问,函数结束时销毁;
嵌套作用域(Enclosing):嵌套函数中,内层函数可访问外层函数的变量(非全局),需用 nonlocal 关键字引用后才能在内层函数修改;
全局作用域(Global):模块顶层定义的变量,整个文件可访问,需用 global 关键字引用后才能在函数内修改;
内置作用域(Built-in):Python内置函数,优先级最低,不可修改。
Python 查找变量的顺序遵循 LEGB 规则(Local → Enclosing → Global → Built-in),即从 局部 → 嵌套 → 全局 → 内置 的顺序查找变量。
三、查看当前全局和局部变量
Python 提供了两个内置函数 globals() 和 locals() ,可以用来查看当前的全局和局部变量。
(一)globals() 内置函数
globals() 返回一个包含当前模块所有全局变量的字典。这个字典包含所有导入的模块、定义的函数、类以及全局变量。globals() 主要用于调试和动态编程。其基本语法为:
globals() 参数:无 返回值:返回一个字典,包含全局作用域的变量。 |
(二) locals() 内置函数
返回一个包含当前局部作用域中所有变量的字典。在模块级别使用时,locals() 和 globals() 返回的内容相同。locals() 主要用于调试和动态代码分析。其基本语法为:
注意: 在模块级别调用时,返回 globals() 的内容。 |
(三)编程示例
理解 Python 命名空间和作用域,对于编写清晰、可维护的Python代码至关重要。正确地管理作用域和命名空间可以帮助避免变量名冲突和意外的值覆盖等问题。