名称空间与作用域
一、定义
用于存放变量名与变量值绑定关系的地方
二、名称空间的分类
1、内置名称空间
python解释器提前定义好的。如print()、len()
2、全局名称空间
在py文件中顶格编写的代码运行之后都会存入全局名称空间
name = 'jason' # name全局 def func(): # func全局 pass if 1: a = 123 # a全局 for i in range(10): print(i) # i全局 print(i)
3、局部名称空间
函数代码体运行之后产生的都是局部名称空间
4、存活周期
4.1、内置名称空间
python解释器启动与关闭而创建和销毁
4.2、全局名称空间
随着py文件的运行与结束而创建和销毁
4.3、局部名称空间
随着函数代码体的执行与结束而创建和销毁
三、名字的查找顺序
1、在查找名字的时候,要先确认自己当前在哪
1、如果你在局部,查找的顺序就是
局部 >>> 全局 >>> 内置
2、如果你在全局,查找顺序是
全局 >>> 内置
2、局部名称空间的嵌套
x = 111 def f1(): x = 222 def f2(): x = 333 def f3(): x = 444 def f4(): x = 555 print(x) # 结果为555 f4() f3() f2() # 通过调用f1 执行所有的函数 f1()
四、名称空间的作用域
作用域:名称空间所能够作用的范围
内置名称空间:程序任何阶段任何位置均可使用(全局有效)
全局名称空间:程序任何阶段任何位置均可使用(全局有效)
局部名称空间:一般情况下只在各自的局部名称空间中有效
五、global与nonlocal关键字使用
1、global使用
局部修改全局数据:如果数据为不可变类型则需要关键字global声明;如果数据为可变类型则无需要关键字global声明。
x = 111 def index(): # 局部修改全局变量 需要使用关键字声明 global x x = 222 index() print(x) name_list = ['jason', 'kevin'] def index(): name_list.append('heiheihei') index() print(name_list)
2、nonlocal使用
如果想要在内部的局部修改外部局部的不可变数据类型,需要关键字nonlocal声明。
def index(): x = 111 def func(): # 内部局部修改外部局部 nonlocal x x = 222 func() print(x) index()