命名空间

命名空间是存放变量的场所。命名空间有局部、全局和内置的,还有对象中的嵌套命名空间。不同命名空间中的变量没有关系。

命名空间通过防止命名冲突来支持模块化。例如,函数 builtins.open 与 os.open 可通过各自的命名空间来区分。

# 函数的局部命名空间,在函数调用时创建
def f():
    x = '函数 f 命名空间中的变量 x'
    print(x)
# 全局命名空间
x = '全局命名空间中的变量 x'
# 调用函数 f,与全局命名空间中的 x 无关
f()
函数 f 命名空间中的变量 x
# 模块 random 导入创建它自己的局部命名空间
import random
# 定义一个全局变量 randint
def randint():
    print('全局 randint')
# random 局部命名空间中的 randint 
# 与全局变量 randint 无关
randint()
random.randint(0,3)
全局 randint


1
# 上述定义的变量 f, x, randint,导入的变量 random,
# 都存放在了当前全局命名空间中
f, x, random, randint
(<function __main__.f()>,
 '全局命名空间中的变量 x',
 <module 'random' from 'C:\\ProgramData\\Anaconda3\\lib\\random.py'>,
 <function __main__.randint()>)

内置命名空间是在 Python 解释器启动时创建,存放的变量包括内置函数、异常等。

# 全局命名空间中定义变量 str,
# 将屏蔽内置命名空间中的 str
def str(x):
    return f'x = {x}'
str(123)
'x = 123'
# 但可以在 builtins 中继续调用
import builtins

builtins.str(123)
'123'

递归函数,每次递归调用,都会有一个新的命名空间。

def f(x):
    if x > 0:
        print(f'x={x}调用,x-1={x-1}继续调用')
    if x == 0:
        print(f'x={x},调用结束')
    else:
        # 以 x-1 作为参数调用函数 f
        return f(x-1)
f(3)
x=3调用,x-1=2继续调用
x=2调用,x-1=1继续调用
x=1调用,x-1=0继续调用
x=0,调用结束

嵌套的命名空间:

a = '全局变量 a'
class A:
    a = '类变量 a'
    def f(self):
        a = '函数局部变量 a'
        return a

print(a)
print(A.a)
print(A().f())
全局变量 a
类变量 a
函数局部变量 a