Python进阶(一)名字空间 | 超详细名字空间解析 内置 全局 局部 调试查看

文章目录

  • 1 内置名字空间
  • 2 全局名字空间
  • 3 局部名字空间
  • 4 类名字空间
  • 5 调试查看名字空间
    • 5.1 查看局部名字空间
    • 5.2 查看全局名字空间

在Python中,名字空间(Namespace)是一个用于存储变量名称和它们对应的对象值的容器。名字空间可以看作是一个映射,将变量名映射到相应的对象值。比如申明一个变量a=1,那么在名字空间字典中就会增加一个映射

‘a’ : ‘1’

Python中有几种不同类型的名字空间,主要包括以下几类:

  1. 内置名字空间(Built-in Namespace): 包含Python解释器内置的函数和对象,例如print()len()。这个名字空间在解释器启动时就被创建,是全局范围的,所以大家可以直观感受到print()非常方便,不需要任何的导入import。

  2. 全局名字空间(Global Namespace): 包含在我们的程序文件级别定义的变量和函数。这个名字空间在模块(module)被导入或程序执行时创建,是模块级别的。

  3. 局部名字空间(Local Namespace): 包含在函数内部定义的变量。这个名字空间在函数调用时创建,包含了函数内部的变量,只在函数执行期间存在,函数执行完之后就销毁。

  4. 类名字空间(Class Namespace): 包含类定义中的变量。每个类都有一个类名字空间,用于存储类的变量和方法。

名字空间之间存在层次关系,被称为名字空间链(Namespace Hierarchy)。当使用变量时,解释器会按照一定的顺序搜索名字空间链,以查找变量对应的对象。

名字空间的一个关键特性是它们提供了作用域(Scope)。作用域定义了变量的可见性和生命周期。比如在一个函数内申明的某个变量,在函数外就不能随意访问了,在一个作用域内定义的变量在该作用域内可见,超出作用域范围后就不再可访问。

对每一部分我们聚一些例子

1 内置名字空间

在任意文件内输入

# 内置名字空间
print("Built-in function:", len("example"))

我们测试了print,和len这两个内置名字空间,这两个函数我们没有提前申明,是内置的

len内置函数可以输出字符串的长度

最后输出

Built-in function: 7

内置的往往都是全局的

2 全局名字空间

# 全局名字空间
global_variable = 10

def my_function():
    # 函数内可以访问全局名字空间
    print("Global variable inside function:", global_variable)

my_function()#测试能否正常访问

输出

Global variable inside function:10

在文件开头我们申明了global_variable=10,则在全局名字空间内增添了一个映射,无论是在函数内还是在函数外都可以正常访问全局名字空间的映射

3 局部名字空间

任意文件内输入

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

4 类名字空间

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.区分

5 调试查看名字空间

有时候我们需要查看名字空间,方便进行调试

通过locals()函数和global()函数可以获得局部和全局名字空间字典

5.1 查看局部名字空间

def my_function():
    local_variable = 5
    print("Local Namespace:", locals())

my_function()

输出

Local Namespace: {'local_variable': 5}

5.2 查看全局名字空间

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的名字空间是一个组织和管理变量的机制,确保在程序中能够正确找到和使用变量。

你可能感兴趣的:(Python学习,python,java,开发语言)