Python3 命名空间/作用域学习笔记

Python中的命名空间是一个名称到对象的映射,它允许我们在程序中使用符号名称来引用变量、函数、类等其他对象。Python中的每个名称都位于某个命名空间中,并且命名空间可以包含其他命名空间。

命名空间的种类

内置命名空间

内置命名空间是由解释器提前定义的,包含所有内置函数、模块、变量等。可以使用 dir() 函数列出内置命名空间中的所有对象。

例如:

pythonCopy Code
print(dir(__builtins__))

全局命名空间

全局命名空间是在整个程序中都可以访问的命名空间,通常位于模块级别,可以使用 globals() 函数查看全局命名空间。

例如:

pythonCopy Code
a = 1 print(globals())

局部命名空间

局部命名空间是在函数体中声明的命名空间,只能在函数体内部访问。在函数被调用时创建,函数返回后被销毁,可以使用 locals() 函数查看局部命名空间。

例如:

pythonCopy Code
def test(): x = 1 print(locals()) test()

作用域

作用域是指在程序中访问命名空间中的名称的区域。Python中有四种作用域,分别是:

  • L (Local):局部作用域,即函数内部定义的名称。
  • E (Enclosing):嵌套作用域,即包含当前函数的其他函数的命名空间。
  • G (Global):全局作用域,即模块顶层定义的名称。
  • B (Built-in):内置作用域,即任何模块都不需要导入就可以使用的名称。

Python中的名称查找是按照 LEGB 规则进行的,即先在局部作用域中查找,然后是嵌套作用域,接着是全局作用域,最后是内置作用域。

例如:

pythonCopy Code
a = 1 def outer(): b = 2 def inner(): c = 3 print(a, b, c) inner() outer()

输出结果为:1 2 3。

实例

假设现在我们要编写一个程序,求一个数的平方和,代码如下:

pythonCopy Code
sum = 0 def square(x): global sum sum += x ** 2 for i in range(1, 6): square(i) print(sum)

在该程序中,我们使用了全局变量 sum,同时也在函数中定义了局部变量 x。由于 sum 是全局变量,因此我们需要使用 global 关键字告诉解释器在函数中使用该变量。在函数 square 中,我们计算了参数 x 的平方并加到了全局变量 sum 中。最后输出全局变量 sum 的值,即 1^2 + 2^2 + 3^2 + 4^2 + 5^2 的值 55。

参考资料