一、名称空间(namespace)
名称空间就是存放名字的地方
1.1 名称空间分类
1、内置名称空间:存放内置的名字,该名称空间随着解释器启动就产生,解释器关闭则销毁
print
len
input
2、全局名称空间:存放的是顶级的名字,运行文件的顶级代码前产生,文件运行完毕则销毁
3、局部名称空间:在函数内定义的名字,调用函数则产生一个函数局部名称空间,该函数调用结束则立即销毁
1.2 查找名字的优先级:
局部名称空间--》全局名称空间--》内置名称空间
1.3 示例
x=10
def f1():
y=2
if 1 > 0:
z=3
if 3 > 1:
m=111
def f1():
len=222
print(len)
f1()
print("站在全局找=============>",len)
len=111
def f1():
len=222
print(len)
len=222
f1()
def f1():
m=1111
return m
def f2():
print(res)
def f3():
print(res)
res=f1()
f2()
f3()
x = 333
def f1():
def f2():
print(x)
f2()
def bar():
pass
def foo():
pass
f1()
1.4 重要概念
名称空间的嵌套关系是在函数定义阶段,
即检测语法时确定的,与函数调用的位置无关,与函数定义位置有关
x=111
def f1():
print(x)
x = 222
f1()
x=111
def f1():
print(x)
def f2():
x=222
f1()
f2()
二、作用域
LEGB 代表名字查找顺序:
locals -> enclosing function -> globals -> __builtins__
locals 是函数内的名字空间,包括局部变量和形参
enclosing 外部嵌套函数的名字空间(闭包中常见)
globals 全局变量,函数定义所在模块的名字空间
builtins 内置模块的名字空间
2.1 全局作用域:
内置名称空间+全局名称空间
特点:全局存活,全局有效
2.2 局部作用域:
局部名称空间
特点:临时存活,局部有效
2.3 global
x=111
def f1():
global x
x=222
f1()
print(x)
3.4 nonlocal关键字
x = 111
def f1():
x = 222
def f2():
global x
x = 333
f2()
print(x)
f1()
print(x)