目录
名称空间即存放名字与对象映射/绑定关系的地方。
在程序执行期间最多会存在三种名称空间
一.内置名称空间
二.全局名称空间
三.局部名称空间
内置名称空间
python系统内置函数产生的名称空间,如print(), len(), open()等, 随着python解释器的运行/关闭而产生/销毁.
全局名称空间
在py文件内编写代码运行产生的名字所产生的名称空间,随着py文件的运行/关闭而产生/销毁.
如: name = 'yietong # name存入py文件全局名称空间
局部名称空间
函数体代码运行产生的都是局部名称空间. 随着函数体代码的运行/关闭而产生/销毁.
def index():
name = 'yietong' # name 存入index 函数的局部名称空间
名字的查找顺序
查找名字之前要先搞清楚自己身处哪个空间.
顺序为: 局部>>> 全局>>> 内置
作用域
作用于就是名称空间能够发挥作用的范围:
内置:程序任意阶段任意位置均可,全局有效
全局:程序任意阶段任意位置均可,全局有效
内置:只在各自局部名称空间有效,局部有效[可通过关键字打破限制]
关键字global 与 nonlocal
函数支持多层嵌套
x=1
def outer():
x=2
def inner(): # 函数名inner属于outer这一层作用域的名字
x=3
print('inner x:%s' %x)
inner()
print('outer x:%s' %x)
outer()
#结果为
inner x:3
outer x:2
global 局部修改全局不可变类型, 可变类型不需要
x=1
def foo():
global x #声明x为全局名称空间的名字
x=2
foo()
print(x) #结果为2
nonlocal 内层修改外层, 不可变类型用nonlocal, 可变类型不需要.
def f1():
x=2
def f2():
nonlocal x
x=3
f2() #调用f2(),修改f1作用域中名字x的值
print(x) #在f1作用域查看x
f1()
#结果
3
nonlocal x会从当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常。