名称空间
1.什么是名称空间(namespaces)
用于存放变量名与变量值绑定关系的地方(类似于民政局)
2.名称空间的分类(重要)
1.内置名称空间
python解释器提前给你定义好的
print()
len()
...
2.全局名称空间
除了函数体代码的局部名称空间和内置名称空间都是全局空间
3.局部名称空间
函数体代码运行之后产生的都是局部名称空间
3.存活周期
1.内置名称空间
python解释器启动与关闭而创建和销毁
2.全局名称空间
随着py文件的运行与结束而创建和销毁
3.局部名称空间
随着函数体代码的执行与结束而创建和销毁
4. 名字的查找顺序
在查找名字的时候 要先确定自己当前在哪
1.如果你在局部
局部 >>> 全局 >>> 内置
2.如果你在全局
全局 >>> 内置
局部名称空间的嵌套
函数在定义阶段名字的查找顺序就已经固定死了
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
def f4():
x = 555
print(x)
f4()
f3()
f2()
# 通过调用f1 执行所有的函数
f1() # 结果为 555
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
def f4():
print(x)
x = 555
f4()
f3()
f2()
# 通过调用f1 执行所有的函数
f1() # 会报错,因为函数在定义阶段名字的查找顺序就已经固定死了,定义阶段在当前局部空间能找到555,但是定义阶段不运行代码,是没问题的,一旦运行代码,x=555取不到,不会去取上层的444,所以会报错
5. 名称空间的作用域
作用域
名称空间所能够作用的范围
内置名称空间
程序任何阶段任何位置均可使用(全局有效)
全局名称空间
程序任何阶段任何位置均可使用(全局有效)
局部名称空间
一般情况下只在各自的局部名称空间中有效
6. global与nonlocal关键字使用
如果想在局部修改全局数据
如果数据为不可变类型则需要关键字global声明
如果数据为可变类型则无需关键字global声明
def f1():
x=2
def f2():
nonlocal x
x=3
f2() #调用f2(),修改f1作用域中名字x的值
print(x) #在f1作用域查看x
f1() #结果 3
"""
如果想要在内部的局部修改外部局部的不可变类型数据
需要关键字nonlocal声明
"""