一、函数的名称空间
首先我们需要了解堆区和栈区的区别
栈区的在内存分区中会通过编译器进行释放,堆区的内存地址只能手动去分配和释放。
名称空间只是对栈区的分区也就是划分栈区里的领地。这块是内置的这块是全局的这块是局部的。
名称空间是彼此独立开的,不存在包含关系。
名称空间是什么 ?
在Python中,命名空间是一个存储变量、函数和类名的容器,它们用于区分不同的变量、函数和类。每个命名空间都有一个唯一的名称,它由Python解释器自动分配
1、内置名称空间
伴随python解释器的启动/关闭而产生/回收,因而是第一个被加载的名称空间,用来存放一些内置的名字,比如内建函数名
max
<built-in function max> #built-in内置的意思
min
<built-in function min>
2、全局名称空间
存放的名字:只要非内置,非函数内定义的名字称之为全局名称空间名字。
存活周期:python文件执行则产生,python文件运行完毕后销毁
3、局部名称空间
存放的名字:在调用函数时,运行函数代码过程中产生的函数体内名字
存活周期:调用函数时存活,调用结束后销毁
4、名称空间的加载顺序是什么样的
内置 >>> 全局 >>> 局部
5、销毁顺序
局部 >>> 全局 >>> 内置
6、名称空间查找优先级:当前所在位置向上查找一层一层查找
当前位置在局部, 局部 > 全局 > 内置
input=333
def dls():
input = 444
print(input)
dls()
当前在全局, 全局 > 内置 找不到就报错。
input=333
def dls():
input = 444
dls()
print(input)
7、天坑实例 :我们肯定以为这样会报错,然而并没有返回的是111.因为从来没有人定义说从局部到全局非要遵循向上查找的原则。我们可以理解为局部到全局查到是个圆形的查到。
def dls():
print(x)
x = 111 #全局已经被定义了。
dls()
8、地坑实例:名称空间的”嵌套“以定义阶段为准和调用无关
x = 1 # 已经定义好了。所以不会等于22
def dls():
print(x)
def lls():
x=22
dls()
lls()
9、神坑实例:变量一定要先定义后引用,不然报错
x=111
def dun():
print(x)
x = 222
dun()
二、函数的作用域
作用域指的是作用范围
1、全局作用域 :内置名称空间和全局名称空间、全局存活、全局有效:被所有函数共享
x=1
def dls():
print(x)
def lls():
print(x)
dls()
lls()
2、局部作用域:局部名称空间、临时存活、局部有效:函数内有效
def dls(x):
def lls():
def tls():
print(x)