「Python系列」Python命名空间和作用域

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 在Python中,命名空间(Namespace)和作用域(Scope)是两个非常重要的概念,它们共同决定了变量、函数、类等对象的可见性和生命周期。

前言

在Python中,命名空间(Namespace)和作用域(Scope)是两个非常重要的概念,它们共同决定了变量、函数、类等对象的可见性和生命周期。

一、Python命名空间

在Python中,命名空间是一个关键概念,它用于组织和隔离变量、函数、类等名称。命名空间防止了名称冲突,使得不同的代码块可以使用相同的名称而不会相互干扰。

Python主要有四种类型的命名空间:

  1. 内置命名空间:包含Python解释器预先定义的名称,如内置函数(如print)和异常。

  2. 全局命名空间:包含模块级别的代码定义的名称,这些代码不在任何函数或类内部。

  3. 局部命名空间:也称为函数命名空间,包含函数或方法内部定义的名称。

  4. 内置命名空间:这是最高级别的命名空间,包含了所有其他的命名空间,并且它总是可用的。

下面是一个简单的案例代码,演示了不同命名空间的使用:

# 内置命名空间中的函数
def print_builtin():
    print("This is a built-in function.")

# 全局命名空间中的变量
global_var = "I am a global variable."

# 定义一个函数,它有自己的局部命名空间
def my_function():
    # 局部命名空间中的变量
    local_var = "I am a local variable."

    # 调用内置命名空间中的函数
    print("Inside my_function:")
    print_builtin()

    # 访问全局命名空间中的变量
    print("Global variable:", global_var)

    # 修改全局命名空间中的变量(不推荐,但可以通过global关键字实现)
    global global_var
    global_var = "Global variable has been changed."

# 调用函数,访问其局部命名空间中的变量
print("Before calling my_function:")
print("Local variable:", local_var)  # 这会引发错误,因为local_var在全局命名空间中不存在

my_function()

print("After calling my_function:")
print("Local variable:", local_var)  # 这同样会引发错误,因为local_var只在my_function的局部命名空间中存在
print("Global variable:", global_var)  # 这将显示my_function中修改后的全局变量值

运行上述代码时,你会注意到以下几点:

  • 在调用my_function之前,尝试访问local_var会引发NameError,因为它还没有被定义。
  • my_function内部,我们可以访问和修改全局变量global_var,但我们需要先使用global关键字声明它。
  • print_builtin函数可以在my_function内部被调用,因为它属于内置命名空间,而内置命名空间对所有的命名空间都是可见的。

这个案例代码展示了命名空间如何隔离变量和函数,并说明了如何在不同的命名空间之间进行操作。在实际编程中,理解命名空间的概念对于避免名称冲突和编写可维护的代码至关重要。

二、Python作用域

作用域决定了变量和其他对象的可见性。Python中的作用域主要有四种:局部作用域(Local)、嵌套局部作用域(Enclosing)、全局作用域(Global)和内置作用域(Built-in)。

  1. 局部作用域:在函数或方法内部定义的对象的作用域是局部的。局部作用域是最小的作用域,仅包含函数或方法内部的变量和函数。

  2. 嵌套局部作用域:如果一个函数嵌套在另一个函数中,那么内部函数可以访问外部函数的局部变量。这种作用域称为嵌套局部作用域或封闭作用域。

  3. 全局作用域:在模块级别定义的变量和函数属于全局作用域。在函数内部,如果没有明确指定作用域,那么变量默认是全局的。

  4. 内置作用域:包含Python解释器内置的函数和异常。内置作用域是最大的作用域,它包含了所有其他作用域。

变量查找顺序

当Python解释器遇到一个变量名时,它会按照以下顺序查找变量:

  1. 局部作用域
  2. 嵌套局部作用域(如果有的话)
  3. 全局作用域
  4. 内置作用域

如果在局部作用域中找不到变量,解释器会继续在嵌套局部作用域中查找,依此类推,直到在内置作用域中找到变量或确定变量不存在。

案例
下面是一个详细的案例代码,用于说明Python中的不同作用域及其行为:

# 内置作用域中的变量和函数
x = 10  # 这是一个全局变量,属于全局作用域

def outer_function():
    # 外层函数的作用域
    y = 20  # 这是一个局部变量,属于outer_function的局部作用域

    def inner_function():
        # 内层函数的作用域
        nonlocal z  # 引用外层函数中的变量z
        z += 10  # 修改外层函数中的变量z

    z = 30  # 这是一个局部变量,属于outer_function的局部作用域(但可以被inner_function通过nonlocal引用)
    inner_function()  # 调用内层函数
    print("In outer_function, z =", z)  # 输出修改后的z值

z = 40  # 这是一个全局变量,但将在后面的代码中被修改

outer_function()  # 调用外层函数
print("In global scope, z =", z)  # 输出全局变量z的值,它不会被外层函数修改

# 访问内置作用域中的函数
print("The value of pi from the math module:", math.pi)

# 导入math模块以访问其内置作用域中的函数和变量
import math

# 输出结果
# In outer_function, z = 40
# In global scope, z = 30
# The value of pi from the math module: 3.141592653589793

在这个例子中,我们有一个全局变量x,一个全局函数outer_function,以及outer_function内部定义的局部变量yz,还有一个内层函数inner_functioninner_function使用nonlocal关键字来修改外层函数的局部变量z

当调用outer_function时,它创建了自己的局部作用域,并在这个作用域中定义了yzinner_function可以访问和修改outer_function的局部作用域中的z,因为z被声明为nonlocal。然而,inner_function不能访问或修改outer_function的局部作用域中的y,除非y也被声明为nonlocal

全局变量zouter_function被调用之前被定义,并在outer_function调用之后被修改。尽管outer_function中的z和全局作用域中的z同名,但它们是两个完全不同的变量,因为outer_function创建了自己的局部作用域。在outer_function内部对z的修改不会影响全局作用域中的z

最后,我们导入了math模块来访问其内置作用域中的pi变量。这展示了内置作用域是如何包含Python解释器预定义的函数和变量的。

注意:在上面的代码中,如果zouter_function外部没有被初始化为40,那么尝试在outer_function内部通过nonlocal引用它将会导致UnboundLocalError,因为Python会认为z是在outer_function内部首次赋值的局部变量。

在Python中,作用域(Scope)指的是变量、函数、类等对象的可见性和生命周期的范围。作用域决定了代码块中变量和其他对象的访问权限。Python中的作用域主要有四种级别:局部作用域(Local)、嵌套局部作用域(Enclosing)、全局作用域(Global)和内置作用域(Built-in)。

三、相关链接

  1. Python下载安装中心
  2. Python官网
  3. Python软件下载
  4. 「Python系列」Python简介及案例
  5. 「Python系列」Python基础语法/数据类型
  6. 「Python系列」Python解释器
  7. 「Python系列」Python运算符
  8. 「Python系列」Python数据结构
  9. 「Python系列」Python元组
  10. 「Python系列」Python集合
  11. 「Python系列」Python列表
相关文章
|
5天前
|
Python
【python】python跨文件使用全局变量
【python】python跨文件使用全局变量
|
5天前
|
Python
Python系列(5)—— 作用域
Python系列(5)—— 作用域
|
6月前
|
Python
26 python - 引用
26 python - 引用
42 0
|
5天前
|
Python
【python】python全局变量怎么使用?
【python】python全局变量怎么使用?
11 1
|
5天前
|
存储 Python
Python命名空间与作用域详解
Python命名空间与作用域详解
20 0
|
5天前
|
JavaScript 前端开发 Java
python中怎么使用作用域
python中怎么使用作用域
15 0
|
9月前
|
Python
Python基础 之 Python3 命名空间和作用域 5
Python3 命名空间和作用域
104 0
11-Python-作用域和命名空间
11-Python-作用域和命名空间
|
5月前
|
自然语言处理 前端开发 测试技术
Python 教程之变量(9)—— Python 中的私有变量
Python 教程之变量(9)—— Python 中的私有变量
40 0
|
6月前
|
程序员 Python
91 python高级 - 作用域
91 python高级 - 作用域
21 0