Python 空间名称与闭包函数
空间名称与闭包函数
名称空间
名称空间 namespaces:存放名字的地方,是对栈区的划分
名称空间在栈区中分为三种,详细的划分不同的空间,不同空间可以存放相同名字的名字
内置名称空间
存放的名字:存放的python解析器内置的名字
存活周期:python解析器启动则产生,python解析器关闭则销毁
全局名称空间
存放的名字:运行顶级代码所产生的名字,不是函数内定义的以及不是python自带的名字
存活周期:python文件执行则产生,python文件运行完毕后销毁
局部名称空间
存放的名字:在调用函数时,运行函数体代码的过程中产生的函数内的名字
存活周期:在调用函数时存活,函数调用完毕后销毁
名称空间的加载顺序
内置名称空间 > 全局名称空间 > 局部名称空间
名称空间销毁顺序
局部名称空间 > 全局名称空间 > 内置名称空间
名字查找优先级
从当前位置线上一层一层查找
例如:当前在局部名称空间
局部名称空间 > 全局名称空间 > 内置名称空间
名称空间的嵌套关系
以函数定义阶段为准,与函数调用位置无关
x = 1
def func():
print(x)
def foo():
x = 222
func()
foo()
#输出结果
1
作用域
全局作用域:内置名称空间、全局名称空间
- 全局存活
- 全局有效:被所以函数共享
局部作用域:局部名称空间
- 临时存活
- 局部有效:函数内有效
闭包函数
闭包函数 = 名称空间与作用域 + 函数嵌套 + 函数对象
核心:名字的查找关系是以函数定义阶段为准
什么是闭包函数
“闭”函数是指该函数是内嵌函数
“包”函数是指该函数包含对外层函数作用域的引用(不是对全局作用域)
def f1():
x = 1
def f2():
print(x)
return f2 #返回f2的内存地址,f2函数对象
x = 111111
f = f1() #把f2的内存地址给f
f() #执行f2函数
#输出结果
1