名称空间
"""
name = 'moon'
1.申请内存空间存储moon
2.给moon绑定一个变量名name
3.后续通过变量名name就可以访问到moon
"""
名称空间就是用来存储变量名与数据值绑定关系的地方(我们也可以简单的理解为就是存储变量名的地方)
1.内置名称空间
解释器运行自动产生 里面包含了很多名字
eg:len print input
2.全局名称空间
py文件运行产生 里面存放文件级别的名字
name = 'moon'
if name:
age = 18
while True:
gender = 'male'
def index():
pass
class MyClass(object):
pass
name\age\gender\index\MyClass
3.局部名称空间
函数体代码运行\类体代码运行 产生的空间
名称空间存活周期及作用范围(域)
存活周期
内置名称空间
python解释器启动则创建 关闭则销毁
全局名称空间
py文件执行则创建 运行结束则销毁
局部名称空间
函数体代码运行创建 函数体代码结束则销毁(类暂且不考虑)
作用域
内置名称空间
解释器级别的全局有效
全局名称空间
py文件级别的全局有效
局部名称空间
函数体代码内有效
名字的查找顺序
涉及到名字的查找 一定要先搞明白自己在哪个空间
1.当我们在局部名称空间中
局部名称空间 >>> 全局名称空间 >>> 内置名称空间
2.当我们在全局名称空间中
全局名称空间 >>> 内置名称空间
ps:其实名字的查找顺序是可以打破的
查找顺序案例
1.相互独立的局部名称空间默认不能够互相访问
def func1():
name = 'moon'
print(age)
def func2():
age = 18
print(name)
2.局部名称空间嵌套
先从自己的局部名称空间查找 之后由内而外依次查找
# 函数体代码中的名字的查找顺序在函数定义阶段就已经固定死了
x = '睡大觉'
def func1():
x = 1
def func2():
x = 2
def func3():
print(x) #在定义阶段查找顺序就定死了
x = 3 # 在x变量名被赋值前就已经打印过了所以打不出3
func3()
func2()
func1()
作业
2.判断下列money的值是多少并说明理由 思考如何修改而不是新增绑定关系
money = 100
def index():
money = 666
print(money)
# 100
money = 100
def func1():
money = 666
def func2():
money = 888
func2()
print(money)
# 100