python基础之名称空间
名称空间
1.名称空间分类
# 引入概念的例子
name = 'jason'
1 在内存空间内申请一块地方 存放'jason'
2 将'jason'绑定一个变量名name
3 后续通过变量名name就可以访问到'jason'所在的内存地址
del name表示清除该绑定关系
名称空间:用来存储变量名与数据值绑定关系的地方(我们也可以简单理解为就是存储变量名的地方)del name
变量名(name)则是存放在名称空间
1.内置名称空间 # py解释器中的名字
解释器运行自动产生,里面包含了很多名字
系统自带的空间,已经提前准备好了很多关键字和变量名
#如: len print
<built-in function len> #built-in内建
2.全局名称空间 # 运行py文件产生的空间
py文件运行产生,里面存放文件级别的名字()
模块名、变量名、函数名、类名
# 如
import sys #模块名sys
x=1 #变量名x
if x == 1:
y=2 #变量名y
def foo(x): #函数名foo
y=1
def bar():
pass
Class Bar: #类名Bar
pass
3.局部名称空间 # 运行函数时产生的空间
函数体代码运行、类体代码 产生的空间
2.名称空间存活周期及作用范围(域)
名称空间的加载顺序是:
内置名称空间->全局名称空间->局部名称空间
1.存活周期
内置名称空间
python解释器启动则创建,关闭则销毁
全局名称空间
py文件执行则创建,运行结束则销毁
局部名称空间
函数体代码、(类体代码)运行则创建,函数体代码结束则销毁
2.作用域
内置名称空间
解释器级别的全局有效
全局名称空间
py文件级别的全局有效
局部名称空间
函数体代码内有效
3.名字的查找顺序
# 大前提: 涉及到名字的查找,一定要搞明白自己在哪个空间
查找顺序:
局部名称空间->全局名称空间->内置名称空间
-> 先在各个空间查找这个名字
1当我们在局部名称空间中的时候
局部名称空间>>> 全局名称空间>>> 内置名称空间
2当我们在全局名称空间中的时候
全局名称空间>>> 内置名称空间
# 其实名字的查找顺序是可以打破的
- 查找顺序的案例
1.相互独立的的局部名称空间默认不能相互访问
def func1():
name = 'jason'
print(age)
def func2():
age = 12
print(name)
相互独立的的局部名称空间默认不能相互访问
2.局部名称空间嵌套
先从自己的局部名称空间查找,然后由内而外依次查找
# 举例:
x = 'tes居然输了'
def func1():
x = 1
def func2():
x = 2
def func3():
print(x)
x = 3
func3()
func2()
func1()
案例中代码运行的顺序
嵌套函数内部的逻辑错误
作业
1.判断下列money的值是多少并说明理由 思考如何修改而不是新增绑定关系
money = 100
def index():
money = 666
print(money)
# 值为100,因为print 打印的变量名money 在当前的全局空间名称空间能找到,如果找不到接着是去内置名称空间中寻找,而不是在函数内的局部名称空间
money = 100
def func1():
money = 666
def func2():
money = 888
func2()
print(money)
# 值为100,因为print 打印的变量名money 在当前的全局空间名称空间中能找到 money=100