跳到主要内容

Python 命名空间和作用域

提示
  1. 命名空间概念:Python 中的命名空间是存储变量和对象的名称的集合,可以在代码的不同部分独立使用相同的名称。
  2. 命名空间类型:Python 包括内置命名空间(解释器启动时创建)、全局命名空间(每个模块创建)、局部命名空间(函数调用时创建),这些命名空间相互隔离。
  3. 变量作用域:作用域决定了可以直接访问哪个命名空间,包括局部作用域(函数内部)、全局作用域(模块内部)和最外层作用域(内置名称)。

简单来说,命名空间是一个名称的集合。

在 Python 中,我们可以将命名空间想象为将我们定义的每个名称映射到相应对象的过程。

它用于在程序中存储变量和其他对象的值,并将它们与特定名称关联。

这使我们能够在代码的不同部分为不同的变量或对象使用相同的名称,而不会引起任何冲突或混淆。

Python 命名空间类型

当我们启动 Python 解释器时,会创建一个包含所有内置名称的命名空间,该命名空间在解释器运行期间一直存在。

这就是为什么像 id()print() 等内置函数始终可以在程序的任何部分使用的原因。每个模块都创建自己的全局命名空间

这些不同的命名空间是隔离的。因此,即使在不同模块中存在相同的名称也不会冲突。

模块可以有各种函数和类。当调用函数时,会创建一个局部命名空间,其中包含定义在其中的所有名称。

类也是如此。下面的图表可能有助于澄清这一概念。

Python 命名空间

Python 变量作用域

尽管定义了各种独特的命名空间,但我们可能无法从程序的每个部分直接访问所有这些命名空间。这时作用域的概念就派上用场了。

作用域是程序的一部分,从这里可以直接访问命名空间,无需任何前缀。

在任何给定时刻,至少有三个嵌套的作用域。

  1. 当前函数的作用域,其中包含局部名称
  2. 模块的作用域,其中包含全局名称
  3. 最外层作用域,其中包含内置名称

当在函数内部进行引用时,会先在局部命名空间中搜索名称,然后是全局命名空间,最后是内置命名空间。

如果一个函数内部有另一个函数,那么一个新的作用域会嵌套在局部作用域内。

示例 1:Python 中的作用域和命名空间

# global_var 在全局命名空间中
global_var = 10

def outer_function():
# outer_var 在局部命名空间中
outer_var = 20
def inner_function():
# inner_var 在嵌套的局部命名空间中
inner_var = 30
print(inner_var)

print(outer_var)

inner_function()

# 打印全局变量的值
print(global_var)

# 调用外部函数并打印局部和嵌套局部变量
outer_function()

输出

10
20
30

在上面的示例中,有三个不同的命名空间:全局命名空间、外部函数内的局部命名空间以及内部函数内的局部命名空间。

这里,

  • global_var - 在全局命名空间中,值为 10
  • outer_val - 在 outer_function() 的局部命名空间中,值为 20
  • inner_val - 在 inner_function() 的嵌套局部命名空间中,值为 30

当代码执行时,首先打印全局变量 global_var,然后在调用外部和内部函数时,打印局部变量:outer_var 和 inner_var。

示例 2:在 Python 中使用 global 关键字

# 定义全局变量
global_var = 10

def my_function():
# 定义局部变量
local_var = 20

# 修改全局变量的值
global global_var
global_var = 30

# 打印全局变量的值
print(global_var) # 输出: 10

# 调用函数并修改全局变量
my_function()

# 打印全局变量修改后的值
print(global_var) # 输出: 30

输出

10
30

在这里,当函数被调用时,使用 global 关键字表明 global_var 是一个全局变量,并将其值修改为 30

因此,当代码执行时,首先打印 global_var 的值为 10,然后调用函数,并将全局变量从函数内部修改为 30

最后再次打印修改后的 global_var 的值。