[名称空间与作用域]
[名称空间与作用域]
名称空间 namespacs:存放名字与其对应的内存地址的地方
有了名称空间之后,就可以在栈区中存放相同的名字,详细的名称空间:↓
一、名称空间分为三大类:
1、内置名称空间
存放的名字:内置名称空间存放的是python解释器自带的名字
例如:print input ....
生命周期:py解释器启动则产生,解释器关闭则销毁
2、全局名称空间
存放的名字:只要不是内置的和函数内定义的名字,都是全局名称空间
生命周期:python文件执行则产生,python文件运行完毕后则销毁
3、局部名称空间
存放的名字:在调用函数时运行函数体代码中产生的函数内的名字
生命周期 :在调用函数时产生,函数调用结束后销毁
4、名称空间的加载顺序
内置名称空间>>全局名称空间>>局部名称空间
5、名称空间的销毁顺序
局部名称空间>>全局名称空间>>内置名称空间
6、名称空间查找优先级:从当前所在位置一层一层查找
内置名称空间
全局名称空间
局部名称空间
6.1如果当前在局部名称空间↓
# 局部名称空间>>>全局名称空间>>内置名称空间
# input = 333 全局找到打印 333 ,全局注释掉则去内置找
# def func():
# input = 444 #先在局部找,局部注释掉没有之后去全局↑找
# print(input)
# func()
6.2 如果当前在全局名称空间
#全局名称空间>>内置名称空间
# .....
示范1:
# def func():
# print(x)
# x = 111
# func()
# input = 333
# def func():
# print(input)
# func()
示范2:名称空间的“嵌套”关系 是以函数定义阶段为准的,与调用位置无关
# input = 111
# def f1():
# # input = 222
# def f2():
# # input=333
# print(input)
# input = 222
# f2()
# f1()
# 名称空间的查找顺序是以定义阶段为准的
# 名称空间的查找顺序是以定义阶段为准的
# 名称空间的查找顺序是以定义阶段为准的
# 名称空间的查找顺序是以定义阶段为准的
# 名称空间的查找顺序是以定义阶段为准的
# 名称空间的查找顺序是以定义阶段为准的
# x = 111
# def func():
# print(x)
# x = 222
# func()
二、作用域-->> 作用范围
全局作用域:内置名称空间、全局名称空间
1、全局存活
2、全局有效
局部作用域:局部名称空间的名字
1、临时存活
2、局部有效:在函数内有效
LEGB
# L:当前位置
# E:外层函数
# G:全局
# B:内置
# 基于当前所在位置向外一层一层查找 L--> E--> G--> B
# LEGB
# builtin
# global
#def f(x):
#enclosing
# def f1():
#enclosing
# def f2():
#local
# print(x)
如果在局部想要修改全局的名字对应的值(不可变类型) 需要用 global
# x= 111
# def func():
# global x # global申明x这个名字是全局的名字,不要再造新的名字
# x = 222
# func()
# print(x)
# 示范
# l = [111,222]
# def func():
# l.append(333) #追加值
# func()
# print(l)
# nonlocal(了解) 修改函数外层函数包含的名字对应的值(不可变类型)
# x = 0
# def f1():
# x=1
# def f2():
# nonlocal x
# x=2
# f2()
# print(x)
# f1()
# global
# x = 111
# def func():
# global x
# x = 222
# func()
# print(x)

浙公网安备 33010602011771号