Python名称空间与作用域
什么是名称空间?
比如下图的长方形代表内存,在这个内存里我要设置一个变量100,那么这个变量得有个门牌号,就叫他a吧,但其实变量不是这么存储的,他其实的存储方式是这样的,他会有一个名称空间,这个名称空间里面有一个表,他这个表里的内容是变量的名对应变量的内存地址这么一个关系,那么你定义一个变量b,那b也会有相应的内存地址,只要你定义变量,名称空间里就会多一组变量名对应他相应的内存地址,你定义以后,他会通过变量内存地址去找你相应的变量的值,他是这么存储的。
就是门牌号对应相应的内存地址。
对于这个表来说,他就是名称空间,也就说名称空间是存储变量名于他相对应的内存地址的关系的一个表。

什么是作用域?
Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的。
函数定义了本地作用域,而模块定义的是全局作用域。
如果想要在函数内定义全局作用域,需要加上global修饰符。
名称空间又分为三种:
内置名称空间:python自带的,启动时就有的。如print、max、min。(ctrl+左键可以看到内置函数的代码)
全局名称空间:顶格写的变量。调用的时候才会产生全局名称空间。
局部:函数体内定义的变量
这三种有什么区别呢?
内置:print是python 的内置函数,函数即变量,那么我们定义一个函数,也就产生了相应的名称空间。print也是一个变量的名字,那么他内置的方法就是他的值(他的方法无非就是打印),他实现的方法也是用代码写出来的,来看一下print里面的代码,选中print,CTRL+鼠标左键。

全局:比如定格写的a = 10,我只要run,那么名称空间里就会有这个变量与他变量值的内存地址对应的关系。整个py文件他都是有效的。

不管是在函数体内调用这个a,还是别处调用,只要是这个py文件,我都能找的到这个变量a。
再看一下这个:

虽然a=5没有定格写,但是他只是做了条件判断,那么这个a也是属于全局名称空间。
局部:函数体内定义的变量

我们可以看到,我在外部调用的时候是找不到变量a的,由此可以得出,函数体内定义变量,是局部名称空间。
所以说print就是一个变量,他的方法就是他的value,所以像python自带的函数,就是内置名称空间。
什么时候有名称空间
在调用定义的变量的时候才有名称空间
python名称空间加载顺序
我们看一下下面这个函数

我们要知道,pyhton执行代码是从上往下执行的,当我一运行这个函数,python解释器知道它函数了,它会去找可执行的代码,因此,这个函数体内代码会被略过,pyhton解释器找到f1(),知道这调用函数f1,它会在返回f1函数体内,它又找到了a=10,并且打印变量a,那么我们在调函数f1的时候产生了局部名称空间,那么我们定义的函数f2呢,它产生了名称空间吗?答案很简单,是没有的,因为函数f2并没有被调用。那么我想调用函数f2怎么调用呢?

这就涉及到了名称空间的访问顺序
内置 全局 局部
看一下这个函数,我指调用了函数f1,它并没报错,调用f2也不会报错,只有调用f3的时候才会报错,因为f3函数体内打印x。而我并没有定义变量x,函数体内的变量产生的局部名称空间,因此,f3调用的变量x不会影响到函数f1和函数f2.


由此可得出名称空间的加载顺序,python解释器一运行,首先加载的内置的,内置不加载的话,函数f1我们就调用不到了,更不用等到调用函数f3出错的时候,其次加载的是全局,我们再函数外部定义x=1的话,那么它会调用这个变量x=1。

最后才运行局部的,我们再在函数f1体内定义一个x=3,那么它会去调用这个x=3。

python名称空间访问顺序
局部 全局 内置

首先来说,我们调用函数f3的时候,它会先找函数f3体内定义的变量x=4,如果它没找到,它会再去找x=3,如果还没找到,再去找x=2,还是没有的话,再找到x=1。
Python名称空间与作用域的更多相关文章
- python名称空间和作用域
python名称空间和作用域 名称空间 名称空间:例如a=1000,python解释器会开辟一块新的内存来存贮1000这个变量值,然后会有一个a指向这个1000,那么a存在哪里?其实他和变量值差不多, ...
- Python 名称空间和作用域
a = 10 # lst = [1,2,3,4] # # # 内置函数 print("你好啊,我叫赛利亚") # def chi(): a = 10 b = 20 # # # # ...
- Python 名称空间与作用域、闭包与装饰器
Python 的名称 Python 的名称(Name)是对象的一个标识(Identifier).我们知道,在 Python 里面一切皆对象,名称就是用来引用对象的.说得有点玄乎,我们以例子说明. 例如 ...
- python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域
一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...
- python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义
复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...
- python之函数对象、函数嵌套、名称空间与作用域、装饰器
一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...
- python基础知识13---函数对象、函数嵌套、名称空间与作用域、装饰器
阅读目录 一 函数对象 二 函数嵌套 三 名称空间与作用域 四 闭包函数 五 装饰器 六 练习题 一 函数对象 1 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 ...
- python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域
复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参: -- 形参:在函数定义时()中出现的参数 ...
- Python 的名称空间和作用域
最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...
随机推荐
- layui 常用确认框、提示框 demo
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- MySQL 将 字符串 转为 整数
MySQL 将 字符串 转为 整数 1.CAST(epr AS type) 1)type 为 SIGNED " AS SIGNED); 效果如下: 2)type 为 UNSIGNED &qu ...
- 自在因梦 | 威爾伯的Fourth Turning所引發的聯想
2015-05-06 胡因梦 ...
- python中日志logging模块的性能及多进程详解
python中日志logging模块的性能及多进程详解 使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python的 ...
- springboot整合mybatis时java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
时区问题造成的,解决方法是在数据源配置文件中在数据库链接处增加参数&serverTimezone=GMT%2B8对时区进行配置,配置为东八区. 修改前:spring.datasource.ur ...
- golang(09) golang 接口内部实现
原文链接 http://www.limerence2017.com/2019/09/24/golang14/#more 前文介绍过golang interface用法,本文详细剖析interface内 ...
- 浅谈微信小程序生命周期
之前在做微信小程序的时候,一直对生命周期里面的onLoad,onShow,onUnload不是很理解.比如说什么时候会触发onUnload. 经过一段时间的测试发现,普通页面的onUnload在三种情 ...
- 【HANA系列】SAP HANA SQL条件判断是NULL的写法
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL条件判断 ...
- PHP-T
TP5目录结构 ├─application 应用目录 ├─extend 扩展类库目录(可定义) ├─public 网站对外访问目录 ├─runtime 运行时目录(可定义) ├─vendor 第三方类 ...
- Python学习之认知(二)
第二章(二) 2.1.5 变量 变量:将运算的中间结果暂存到内存,以便后续程序调⽤. 变量的命名规则: 1.变量由字母, 数字,下划线搭配组合⽽成 2.不可以⽤数字开头,更不能是全数字 ...