‘a’ : ‘1’
Python中有几种不同类型的名字空间,主要包括以下几类:
内置名字空间(Built-in Namespace): 包含Python解释器内置的函数和对象,例如print()
和len()
。这个名字空间在解释器启动时就被创建,是全局范围的,所以大家可以直观感受到print()非常方便,不需要任何的导入import。
全局名字空间(Global Namespace): 包含在我们的程序文件级别定义的变量和函数。这个名字空间在模块(module)被导入或程序执行时创建,是模块级别的。
局部名字空间(Local Namespace): 包含在函数内部定义的变量。这个名字空间在函数调用时创建,包含了函数内部的变量,只在函数执行期间存在,函数执行完之后就销毁。
类名字空间(Class Namespace): 包含类定义中的变量。每个类都有一个类名字空间,用于存储类的变量和方法。
名字空间之间存在层次关系,被称为名字空间链(Namespace Hierarchy)。当使用变量时,解释器会按照一定的顺序搜索名字空间链,以查找变量对应的对象。
名字空间的一个关键特性是它们提供了作用域(Scope)。作用域定义了变量的可见性和生命周期。比如在一个函数内申明的某个变量,在函数外就不能随意访问了,在一个作用域内定义的变量在该作用域内可见,超出作用域范围后就不再可访问。
对每一部分我们聚一些例子
在任意文件内输入
# 内置名字空间
print("Built-in function:", len("example"))
我们测试了print,和len这两个内置名字空间,这两个函数我们没有提前申明,是内置的
len内置函数可以输出字符串的长度
最后输出
Built-in function: 7
内置的往往都是全局的
# 全局名字空间
global_variable = 10
def my_function():
# 函数内可以访问全局名字空间
print("Global variable inside function:", global_variable)
my_function()#测试能否正常访问
输出
Global variable inside function:10
在文件开头我们申明了global_variable=10,则在全局名字空间内增添了一个映射,无论是在函数内还是在函数外都可以正常访问全局名字空间的映射
任意文件内输入
def my_function():
# 局部名字空间
local_variable = 5
print("Local variable inside function:", local_variable)
my_function()
# 尝试访问局部变量会引发 NameError
print("Trying to access local variable outside function:", local_variable)
输出
Local variable inside function: 5
...
NameError: name 'local_variable' is not defined
可见在函数内访问则可以正常输出,函数外访问则会导致引发 NameError
class MyClass:
class_variable = "Class Variable" # 类变量属于类的名字空间,每一个实例都可以访问
def __init__(self, instance_variable):
# 实例变量属于实例的名字空间,每一个实例只能访问自己的实例变量
self.instance_variable = instance_variable
def print_variables(self):
print("Class Variable:", MyClass.class_variable)
print("Instance Variable:", self.instance_variable)
# 创建类的实例
obj1 = MyClass("Instance Value")
obj1.print_variables()
obj2=MyClass("Instance Value2")
obj2.print_variables()
输出
Class Variable: Class Variable
Instance Variable: Instance Value
Class Variable: Class Variable
Instance Variable: Instance Value2
类变量属于类的名字空间,每一个实例都可以访问
实例变量属于实例的名字空间,每一个实例只能访问自己的实例变量,用self.区分
有时候我们需要查看名字空间,方便进行调试
通过locals()函数和global()函数可以获得局部和全局名字空间字典
def my_function():
local_variable = 5
print("Local Namespace:", locals())
my_function()
输出
Local Namespace: {'local_variable': 5}
global_variable = 10
def my_function():
print("Global Namespace:", globals())
my_function()
输出
Global Namespace: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000020D60796CD0>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 'f:\\BaiduSyncdisk\\Code\\数据处理\\名字空间.py', '__cached__':
None, 'global_variable': 10, 'my_function': }
可以看到输出较为复杂,因为我们在一开始说过,内置的往往都是全局的,所以我们可以看到除了我们自己申明的全局名字如global_variable,my_function,还有很多没申明的,比如name,比如有获得文件目录的 _ _ file _ _全局变量,这些都是内置的
总结来看,Python的名字空间是一个组织和管理变量的机制,确保在程序中能够正确找到和使用变量。