Python3 命名空间/作用域学习笔记
Python中的命名空间是一个名称到对象的映射,它允许我们在程序中使用符号名称来引用变量、函数、类等其他对象。Python中的每个名称都位于某个命名空间中,并且命名空间可以包含其他命名空间。
命名空间的种类
内置命名空间
内置命名空间是由解释器提前定义的,包含所有内置函数、模块、变量等。可以使用 dir() 函数列出内置命名空间中的所有对象。
例如:
pythonCopy Codeprint(dir(__builtins__))
全局命名空间
全局命名空间是在整个程序中都可以访问的命名空间,通常位于模块级别,可以使用 globals() 函数查看全局命名空间。
例如:
pythonCopy Codea = 1
print(globals())
局部命名空间
局部命名空间是在函数体中声明的命名空间,只能在函数体内部访问。在函数被调用时创建,函数返回后被销毁,可以使用 locals() 函数查看局部命名空间。
例如:
pythonCopy Codedef test():
x = 1
print(locals())
test()
作用域
作用域是指在程序中访问命名空间中的名称的区域。Python中有四种作用域,分别是:
- L (Local):局部作用域,即函数内部定义的名称。
- E (Enclosing):嵌套作用域,即包含当前函数的其他函数的命名空间。
- G (Global):全局作用域,即模块顶层定义的名称。
- B (Built-in):内置作用域,即任何模块都不需要导入就可以使用的名称。
Python中的名称查找是按照 LEGB 规则进行的,即先在局部作用域中查找,然后是嵌套作用域,接着是全局作用域,最后是内置作用域。
例如:
pythonCopy Codea = 1
def outer():
b = 2
def inner():
c = 3
print(a, b, c)
inner()
outer()
输出结果为:1 2 3。
实例
假设现在我们要编写一个程序,求一个数的平方和,代码如下:
pythonCopy Codesum = 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。