当我们在Python中定义一个函数、类、变量时,它们都会被存储在命名空间中。命名空间是一个包含变量、函数等对象的名称到对象之间的映射。在Python中,命名空间可以分为以下几种:
1.内置命名空间:这个命名空间是Python解释器所持有的,并且解释器启动时已经存在。它包含了所有内置函数、异常、类等对象。
2.全局命名空间:在Python中,模块也可以看做一个命名空间,所有在模块中定义的函数、类、变量都属于这个命名空间。
3.局部命名空间:当一个函数被调用时,就会产生一个局部命名空间。这个命名空间中包含了所有在函数中定义的变量、函数等对象。
Python中的命名空间是通过字典(Dictionary)实现的,也就是说,每个命名空间都是一个字典对象。
下面是一个简单的示例代码:
# 定义一个全局变量
a = 10
# 定义一个函数
def test():
# 定义一个局部变量
b = 20
print(a, b)
# 调用函数
test()
当上面这段代码被执行时,会首先创建一个全局命名空间,并在其中存储变量a
。在调用函数test()
时,会创建一个局部命名空间,其中存储了变量b
。在打印变量a
和b
时,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
。在打印变量x
、y
和z
时,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
。