名称空间
名称空间的介绍
- 名称空间就是变量名与数据值之间绑定关系的地方
- 在内存空间中申请一块内存空间存储数据值,然后绑定变量名,变量鸣与数据值绑定的关系就会被存储到名称空间中,之后使用的相同变量名都是去名称空间里查找对应的数据值
- 使用del删除的不是数据值,而是变量名与变量名与数据值之间的绑定关系
名称空间的分类
- 1.内置名称空间
- 在python解释器运行时就已经创建的空间,可以直接使用的名字(len(),print(),input()等)
- 2.全局名称空间
- 在python代码运行过程中创建的变量名,最外层的函数名,类名会在该空间存入
1.普通代码中的变量名 2.分支,循环结构中的变量名 3.定义函数的函数名 4.定义类的函数名 - 3.局部名称空间
- 函数体代码运行过程产生的名字会存入该空间
名称空间的存活周期
- 内置名称空间
- python解释器打开时创建,关闭时删除
- 全局名称空间
- 代码文件运行时创建,运行结束时删除
- 局部名称空间
- 函数体代码运行时创建,运行结束时删除
名称空间的查找顺序
- 从自己当前所在空间依次往外围查找(局部>>全局>>内置)
名称空间的作用域
- 内置名称空间与全局名称空间在程序全局的任何位置都能使用
- 局部名称空间在在自己局部空间的位置使用
局部名称空间
局部名称空间复杂情况
- 1.同一级别的两个局部名称空间默认情况下,不能互相使用彼此函数内的变量名
错误案例:
def num1():
num = 12
print(age)
def num2():
age = 20
print(num)
num1()
num2() # 程序报错
正确案例:
def num1():
num = 12
print(num)
def num2():
age = 20
print(age)
num1()
num2() # 函数在定义阶段其实名字的查找顺序就已经固定死了
global与nonlocal关键字
- 使用(global 变量名)可以对全局中的同变量名的数据进行操作
- 局部名称空间出现新的名字会在局部名称空间中存储。
- 在局部修改全局的变量名的数据可以使用global
- 可变类型数据修改无需关键字,所以global用于修改不可变类型的数据。
变量名 = 数据值 def 函数名(): global 变量名 变量名 = 新数据值 print(变量名) 函数名() print(变量名) # 局部全局都为新数据值 - 使用nonlocal 可以在内层局部空间修改外层局部空间的不可变类型的数据
函数名的多种使用方式
-
1.函数名可以被用来多次赋值(函数名与变量名使用一致)
-
2.函数名可以被当作函数的实参
-
3.函数名可以被当作函数的返回值
-
4.函数名还可以当作容器类型里面的数据值