Python中的命名空间(Namespace)是一种独特的机制,用于存储变量名称和对象的映射关系。Python中的每个命名空间都是一个字典,其中key表示变量的名称(标识符),value则是对应的对象。在Python中,有四种命名空间,分别是:内置命名空间、全局命名空间、局部命名空间和非本地命名空间。下面分别进行详细说明:
1. 内置命名空间
内置命名空间包含Python中的内置函数和内置模块等等。在Python解释器启动时就会自动加载内置命名空间。因此,在输入之前就可以使用内置变量。
一般我们使用内置函数或者模块都不需要显示地导入(import),因为它们已经包含在了内置命名空间中。比如,内置函数 print()
, 以及内置模块random
:
import random
num = random.randint(1, 10)
print(num)
在以上的示例中,我们使用了Python的内置函数print()
,不需要导入即可直接使用。另外,还使用了内置模块random
,需要通过导入的方式引入模块。
2. 全局命名空间
全局命名空间是指整个Python脚本中所有函数和类定义中都可以访问的命名空间。全局命名空间的创建时机是:在模块被导入时创建。全局变量也是存储在全局命名空间之中。
在Python中使用 globals()
函数可以查看全局命名空间中定义的变量。下面的示例中,我们定义了变量x
,并将其值赋为10。由于x
是在全局作用域中定义的,因此它会被保存在全局命名空间中,我们可以通过 globals()
函数看到它。
x = 10
def print_global_x():
print(globals()['x'])
print_global_x() # 10
在以上代码中,我们通过 globals()
函数获取到了全局命名空间中的变量,再通过打印函数打印出了变量的值。
3. 局部命名空间
Python中的局部命名空间指的是函数中的命名空间。Python内置了许多命名空间,其中最常见的就是函数作用域的命名空间,因为 Python 中的函数就是一个小型的命名空间。
当 Python 调用函数时,就会为函数启动一个新的局部命名空间。而在函数运行的过程中,函数内的变量名会存储在这个新的命名空间中。当函数运行完毕后,这个新的命名空间会被销毁。
下面的示例代码展示了如何使用 locals()
函数查看局部命名空间中的变量:
def test():
num = 5
print(locals())
test() # {'num': 5}
在上面的代码中,我们定义了一个函数test,其中定义了一个局部变量num,并使用locals()
函数查看了函数的局部命名空间中变量的值。
4. 非本地命名空间
非本地命名空间(Nonlocal Namespace)是一种介于全局命名空间和局部命名空间之间的一种命名空间类型,它只能在内部函数或嵌套函数中访问,表示离当前函数最近的外部作用域。
下面的示例代码展示了一个使用非本地命名空间的例子:
def outer():
x = 'local'
def inner():
nonlocal x
x = 'nonlocal'
print('inner:', x)
inner()
print('outer:', x)
outer() # inner: nonlocal outer: nonlocal
在上面的代码中,我们定义了一个outer函数,它包含了一个内部函数inner。内部函数inner访问了outer函数的x变量(x是outer函数中定义的局部变量)。我们使用Python关键字 nonlocal
来声明x变量,表示这里的x变量是非本地变量,它是当前函数最近的外部作用域中的变量。然后修改了它的值,最后在outer函数中打印了x变量的值,可以看到,x变量的值已经被修改为’nonlocal’了。
希望上述的文字描述和代码示例能够帮助您更好的理解Python命名空间的概念与应用。