名称空间
名称空间
什么是名称空间(namespaces)
用于存放变量名与变量值绑定关系的地方(类似于民政局)
名称空间的分类(重要)
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全局 while True: a = 123 # a全局
3.局部名称空间
函数体代码运行之后产生的都是局部名称空间
4.存活周期
1.内置名称空间
python解释器启动与关闭而创建和销毁
2.全局名称空间
随着py文件的运行与结束而创建和销毁
3.局部名称空间
随着函数体代码的执行与结束而创建和销毁
查看函数的名称空间
locals() 查看局部的
globals() 查看全局的
在查找名字的时候 要先确定自己当前在哪
1.如果你在局部
局部 >>> 全局 >>> 内置
2.如果你在全局
全局 >>> 内置
局部名称空间的嵌套
'''函数在定义阶段名字的查找顺序就已经固定死了(特例)''' x = 111 def f1(): x = 222 def f2(): x = 333 def f3(): x = 444 def f4(): x = 555 print(x) # x = 555 特例 f4() f3() f2() # 通过调用f1 执行所有的函数 f1()
作用域
名称空间所能够作用的范围
内置名称空间
程序任何阶段任何位置均可使用(全局有效)
全局名称空间
程序任何阶段任何位置均可使用(全局有效)
局部名称空间
一般情况下只在各自的局部名称空间中有效
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) """ 如果想在局部修改全局数据 如果数据为不可变类型则需要关键字global声明 如果数据为可变类型则无需关键字global声明 """ def index(): # x = 111 l1 = [11,22] def func(): # 内部局部修改外部局部 l1.append(333) func() print(l1) index() """ 如果想要在内部的局部修改外部局部的不可变类型数据 需要关键字nonlocal声明 """
END