浅析Python的命名空间与作用域


Posted in Python onNovember 25, 2020

名称空间

名称空间(namespaces):用于存放名字与内存地址绑定关系的地方,是对栈区的划分
作用:名称空间可以使栈区中存放相同的名字,从而解决命名冲突
名称空间分为三种:

  • 内置名称空间
  • 全局名称空间
  • 局部名称空间

内置名称空间

  • 内置名称空间:用于存放Python解释器中内置的名字
  • 生命周期:Python解释器启动则产生,Python解释器关闭则销毁
  • 例如:print、input、int ...

全局名称空间

  • 全局名称空间:运行顶级代码所产生的名字,或者说除函数内定义以及内置的外,剩下的都是全局名称空间
  • 生命周期:Python文件执行时产生,Python文件执行完毕后销毁
  • 例如:
# 变量名a
a = 1

# 函数名func
def func():
  pass

# 类名MyClass
class MyClass:
  pass

局部名称空间

局部命名空间:在调用函数时,运行函数体代码过程中产生的函数内的名字
生命周期:函数调用时产生,函数调用完毕后销毁
例如:

def func(x, y):
  pass

func(1, 2)

名称空间的先后顺序

  • 名称空间加载顺序:内置名称空间 -> 全局名称空间 -> 局部名称空间
  • 名称空间销毁顺序:局部名称空间 -> 全局名称空间 -> 内置名称空间
  • 名字的查找优先级:从当前所在位置向上一层一层查找

作用域

全局作用域

全局作用域:内置名称空间、全局名称空间

特点:

  • 全局存活
  • 全局有效:被所有函数共享

局部作用域

局部作用域:局部名称空间

特点:

  • 临时存活
  • 局部有效:函数内有效

LEGB原则

找寻变量的调用顺序采用LEGB原则(即就近原则)
B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)
G —— Global(module); 函数外部所在的命名空间 (全局作用域)
E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)
L —— Local(function);当前函数内的作用域 (局部作用域)
依据就近原则,从下往上 从里向外 依次寻找

global与nonlocal

  • global:声明全局变量获修改全局变量
  • nonlocal:修改局部变量(当前函数上一层的局部变量)
# global的使用
x = 1
def func():
  global x
  x = 2
func()
print(x)

# nonlocal的使用
def func1():
  x = 1
  def func2():
    nonlocal x
    x = 2
  func2()
  print(x)
func1()

总结

  • 名称空间是对栈的一种划分,真正存在的是栈区。名称空间只是一种虚拟的划分
  • 名称空间只有优先级之分,并无没有嵌套关系
  • 名称空间的“嵌套关系”决定了名字的查找顺序
  • 名称空间的“嵌套关系”以函数定义阶段为准

以上就是浅析Python的命名空间与作用域的详细内容,更多关于python 命名空间与作用域的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用Python脚本在Linux下实现部分Bash Shell的教程
Apr 17 Python
Python操作MySQL数据库的方法
Jun 20 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
Django接收post前端返回的json格式数据代码实现
Jul 31 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
使用python模拟命令行终端的示例
Aug 13 Python
python查看数据类型的方法
Oct 12 Python
python pygame实现球球大作战
Nov 25 Python
selenium WebDriverWait类等待机制的实现
Mar 18 Python
Django的ListView超详细用法(含分页paginate)
May 21 Python
Python中and和or如何使用
May 28 Python
python uuid生成唯一id或str的最简单案例
Jan 13 Python
重构Python代码的六个实例
Nov 25 #Python
python try...finally...的实现方法
Nov 25 #Python
通过Python pyecharts输出保存图片代码实例
Nov 25 #Python
如何基于Python和Flask编写Prometheus监控
Nov 25 #Python
python3爬虫中多线程进行解锁操作实例
Nov 25 #Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 #Python
python 基于wx实现音乐播放
Nov 24 #Python
You might like
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
javascript入门·对象属性方法大总结
2007/10/01 Javascript
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
Jquery选择器 $实现原理
2009/12/02 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
JavaScript中的apply()方法和call()方法使用介绍
2012/07/25 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
2016/05/21 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
2016/06/25 Javascript
Bootstrap Table从零开始
2017/06/30 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
Vue如何实现响应式系统
2018/07/11 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
Python中datetime常用时间处理方法
2015/06/15 Python
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
Python简单实现区域生长方式
2020/01/16 Python
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
机电工程专业应届生求职信
2013/10/03 职场文书
员工考核评语大全
2014/04/26 职场文书
1亿有多大教学反思
2014/05/01 职场文书
推普周活动总结
2014/08/28 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
街道社区活动报告
2015/02/05 职场文书
python基础详解之if循环语句
2021/04/24 Python
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript