Python3 命名空间和作用域


Python3命名空间和作用域

在开始深入学习 Python3 之前,必须了解Python 命名空间和作用域的概念。

Python3 中的命名空间是一个容器,存储程序中创建的对象。我们可以将其看做是一张表,其中存储了对象的名称和实际引用。Python中主要存在以下命名空间:

  • built-in namespace(内建命名空间):Python 解释器默认加载的这个命名空间中,包括了所有内建函数,比如 str()、int() 等。
  • global namespace(全局命名空间):指的是文件级别的命名空间,即一个模块中的全局命名空间,从模块被导入开始创建。
  • local namespace(局部命名空间):是在一个函数调用中创建的,用于用于存储局部变量。

Python中存在四种作用域,可以帮助我们理解和控制程序执行流程。作用域规定了一个变量的可见范围和生命周期范围。

  • L(Local): 局部作用域,在函数或者类中定义。
  • E(Enclosing):闭包函数外的函数内部。
  • G(Global): 全局作用域,在模块中定义。
  • B(Built-in):内建作用域,Python 解释器会自动向其添加内建函数的命名空间。

Python解释器会按照 L - E - G - B 的顺序查找变量。也就是说,如果在局部作用域 L 找不到相应的变量,Python解释器就会依次到上一层的 E 搜索变量,接着依次到 G(全局) 和 B(内建),直到找到变量为止。如果最后都没有找到变量,Python解释器会抛出 NameError 的异常。

作用域也可以嵌套,子作用域可以使用父作用域中的变量,但是父作用域无法使用子作用域中的变量。

以下是 Python3 命名空间和作用域的示例代码:

#全局变量
d = 10
def testFunc():
    #局部变量
    a = 5
    global d
    d = d + a #调用全局变量并修改
    print("a:", a)
    print("d:", d)

testFunc() 
print("d in global:", d) #此处输出 d=15

以上代码中,有一个全局变量 d=10,在函数testFunc()中首先定义了一个局部变量 a=5,最后通过global d语句声明要修改全局变量 d 的值,最终输出 d=15。使用global关键字可以声明在函数体内要使用全局变量。

总结:掌握 Python3 命名空间和作用域的概念是编写 Python 程序的关键之一。了解它们的应用可以避免变量命名冲突,并为程序提供一个清晰的、有效的结构。