家好,我是杨数Tos,这是《从零基础到大神》系列课程的第52篇文章,第三阶段的课程:Python进阶知识:Python进阶知识:详细讲解Python中的函数(五)=====>Python中函数的名称空间与作用域(上篇)。
函数是非常重要的内容,在这里,我会用10篇左右的文章详细讲解Python中函数定义与使用的规则。
阅读提醒:建议小白先看一遍:【计算机基础知识】和【Python基础知识】课程,否则你不一定听得懂!
一、定义新的函数时发生的事情
1、定义了一个新的函数时,会发生以下事情:
① 定义一个新函数时,Python解释器会向操作系统发出申请内存空间的指令;
② 将函数体代码保存到内存空间;
③ 将函数体代码的内存地址绑定给函数名(引用传递)
注:Python中定义函数时,只会开辟内存空间,检测函数的语法;并不会立即执行函数。
如图所示:
2、函数名与函数返回值的不同
函数名:指向的是这个函数名字的名称空间的内存地址;
函数的返回值,即函数名加括号(),指向的是运行了函数功能之后,得到的具体返回值的内存地址,即return语句后面的内容;
前面的文章中讲到的,Python中函数的3种调用方式:
a. 表达式形式:X =函数名()
b. 语句形式:X =函数名
c. 把函数返回值或函数当作参数调用:X = run(1,函数名);
它们实质上就两种调用方式,一种是指向函数名的内存地址,另一种是指向了函数返回值的内存地址。
如下图所示:
【重要】Python中所有的值的传递,都不是传递值的本身,而是内存地址的传递,也有人叫它:引用传递;
二、Python中的3种名称空间
名称空间是我们在之前的文章中讲过的概念,这里不再详述名称空间的概念;我们直接讲关于Python函数中名称空间的问题。
名称空间:存放名字的地方,是内存在栈区的划分。
1、Python中名称空间的分类
在PYthon中的名称空间,可以分为以下3种:内置名称空间、全局名称空间、局部名称空间;顾名思义,内置指的是预先设置好的,只要Python解释器还在运行,内置名称空间就会一直占用内存不被释放。
即:内置、全局、局部3种。
2、Python中3种名称空间的优先级问题
(1) 3种名称空间的加载顺序
A. Python解释器启动时,会将内置的名称空间预先加载到内存中,如:小整数池的预加载;
B. 当我们运行某个x.py文件时,会启动这个文件内全局变量或方法的名称空间;
C. 如果我们调用了函数内的某个局部参数,会启动函数内变量的名称空间;
加载顺序:内置==>全局 ==> 局部
(2) 3种名称空间的存活周期
D. 当我们调用的函数执行完毕且没有被其他方法或变量引用,函数内局部变量会被释放,同时也释放了对应局部变量的名称空间;
E. 当x.py文件运行完毕之后,这个x.py文件内的全局名称空间也会被释放;
F. 当我们把所有的.py文件运行完毕,将Python解释器关闭后,内置名称空间也会随之被释放;
存活周期:局部==>全局 ==> 内置
(3) 3种名称空间的查找优先级
名称空间的查找遵循着就近原则,哪个离它最近,它找的就是哪个;注意这个就近,不是地理意义上的近,而是指3重名称空间之间的距离;
因为:函数之间在关系是以函数定义阶段进行确定的;如果函数定义阶段使用了没有被定义的变量,会报错!!
【重要】函数之间在关系是以函数定义阶段进行确定的;
如图所示:
虽然有一个就近的变量x,但打印的结果依旧是函数内的变量x;我们再看另一种情况:
虽然函数体内并没有变量x,但是得出x的值仍然是定义函数之前的数值;
因为定义函数时只检测语法,并不执行函数,而且函数之间在关系是以函数定义阶段进行确定的;
以上是本期内容,如果有表达不对的内容,欢迎您的留言、斧正,我们一起天天向上。
感谢您的阅读,您的三连【关注、点赞、收藏】就是对我最大的支持,谢谢!
本文由杨数Tos原创,欢迎关注,带你一起长知识。