第52p,你去全局找,跟我局部没关系!Python中的名称空间与作用域

家好,我是杨数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原创,欢迎关注,带你一起长知识。

你可能感兴趣的:(第52p,你去全局找,跟我局部没关系!Python中的名称空间与作用域)