名称空间和作用域
#变量名和内存地址对应的表叫做名称空间
# 内置名称空间:(python启动时就有,python自带的)python解释器内置的名字,print,max,min
# 全局名称空间:(执行python文件时启动,包括if判断得出的结果)定义的变量
# 局部名称空间:(调用函数时启动,调用结束失效)函数内部定义的变量
# 总结:三者的加载顺序
# 内置 - -->全局 - -->局部
# 三者的访问顺序
# 局部 - -->全局 - -->内置
一、函数之名称空间
1.1、什么是名称空间
名称空间:存放名字的地方
例子:S=1,1存放于内存中,那名字 S 存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方
1.2、名称空间 (存放名字与值的绑定关系)
1、内置名称空间
存放python解释器自带名字,比如内置的函数名:len,max,sum
创建:随着python解释器启动而创建
销毁:随着python解释器关闭而销毁
2、全局名称空间
存放文件级别的名字,比如x,f1,z x=1 def f1(): y=2 if x == 1: z=3
创建:文件开始执行时则立即创建
销毁:文件开始执行完毕时则销毁
3、局部名称空间
存放函数内的名字,强调:函数的参数也属于局部的
创建:函数执行时才临时创建
销毁:函数执行完毕则立即销毁
4、名称空间的加载顺序
内置名称空间--->全局名称空间--->局部名称空间
强调:加载的目的是为了把名字存起来,存起来的目的是为了取出来,那么但凡查找一个名字一定会从三种名称空间之一找到。
5、名称空间的查找名字顺序
局部名称空间===>全局名称空间===>内置名称空间
例子:名称空间加载顺序与名称空间查找名字顺序使用案例
len=10 def f1(): # len=100 def f2(): # len=1000 def f3(): # len=10000 print(len) f3() # len=200 f2() len=11111111111 #这里相当于修改了全局定义的'len=10',修改为'len=11111111111' f1() len=11111111111
函数的查找关系是在函数定义阶段就已经固定死的,与调用位置无关
# 函数名字的查找关系是在函数定义阶段就已经固定死的,与调用位置无关
x=100 def f1(): x=10 print(x) def f2(): x=111111 f1() f2() >>:10
二、作用域
全局范围:内置名称空间中的名字,全局名称空间中的名字
特点:全局有效,全局存活
局部范围:局部名称空间中的名字
特点:局部有效,临时存活
全局变量:定义在全局作用域的名字
局部变量:定义在局部作用域的名字
2.1、当全局数据类型是可变类型时,在函数内是可以修改的
l=[] #全局类型(可变数据类型) def foo1(): l.append(2) #在函数内往全局类型里面追加数据 foo1() print(l) >>:[2] #追加完毕后,全局类型l的值已经为[2] 2.2、当全局数据类型是不可变类型时,在函数内不能修改 L=100 #全局类型(不可变类型) def foo1(): L=222 #在函数内定义L的值为222 foo1() print(L) >>:100 #执行后全局类型L的值并没有被修改
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步