详解python命名空间

  • Post category:Python

当我们在Python中定义一个函数、类、变量时,它们都会被存储在命名空间中。命名空间是一个包含变量、函数等对象的名称到对象之间的映射。在Python中,命名空间可以分为以下几种:

1.内置命名空间:这个命名空间是Python解释器所持有的,并且解释器启动时已经存在。它包含了所有内置函数、异常、类等对象。

2.全局命名空间:在Python中,模块也可以看做一个命名空间,所有在模块中定义的函数、类、变量都属于这个命名空间。

3.局部命名空间:当一个函数被调用时,就会产生一个局部命名空间。这个命名空间中包含了所有在函数中定义的变量、函数等对象。

Python中的命名空间是通过字典(Dictionary)实现的,也就是说,每个命名空间都是一个字典对象。

下面是一个简单的示例代码:

# 定义一个全局变量
a = 10

# 定义一个函数
def test():
    # 定义一个局部变量
    b = 20
    print(a, b)

# 调用函数
test()

当上面这段代码被执行时,会首先创建一个全局命名空间,并在其中存储变量a。在调用函数test()时,会创建一个局部命名空间,其中存储了变量b。在打印变量ab时,Python会首先在局部命名空间中查找变量a,如果找不到,再去全局命名空间中查找。

随着程序的运行,不同的函数会创建不同的局部命名空间,它们之间是相互独立的。

再看一个更复杂一点的示例代码:

# 定义全局变量
x = 10

# 定义函数1
def func1():
    # 定义局部变量
    y = 20

    # 定义函数2
    def func2():
        # 定义局部变量
        z = 30
        print('x:', x, 'y:', y, 'z:', z)

    # 调用函数2
    func2()

# 调用函数1
func1()

当上面这段代码被执行时,会首先创建一个全局命名空间,并在其中存储变量x。在调用函数func1()时,会创建一个局部命名空间,其中存储了变量y和函数func2()。在调用函数func2()时,会创建一个局部命名空间,其中存储了变量z。在打印变量xyz时,Python会首先在局部命名空间中查找变量z,如果找不到,再去外层函数的命名空间中查找变量y,如果还是找不到,再去全局命名空间中查找变量x

需要注意的是,在Python中,命名空间是有层次关系的,内嵌的命名空间可以访问外部命名空间中的变量,但是外部命名空间不能访问内嵌命名空间中的变量。如果在内嵌命名空间中要修改外部命名空间中的变量,则需要使用关键字global来声明。例如:

# 定义全局变量
x = 10

# 定义函数1
def func1():
    # 这里声明变量x使用的是全局变量x
    global x
    x = 20

    # 定义函数2
    def func2():
        # 定义局部变量x
        x = 30
        print('x:', x)

    # 调用函数2
    func2()

# 调用函数1
func1()
print('x:', x)

当上面这段代码被执行时,会首先创建一个全局命名空间,并在其中存储变量x。在调用函数func1()时,会创建一个局部命名空间。在声明变量x时,使用了关键字global,表示要修改全局命名空间中的变量x。接着,在调用函数func2()时,会创建一个局部命名空间,在这个命名空间中定义了一个名为x的变量,并将它赋值为30。在打印变量x时,Python会首先在局部命名空间中查找变量x,发现存在,就输出其值30。在函数func2()执行完后,会回到外部命名空间中,打印其中的变量x,发现它的值已经被修改为20