浅析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中Random和Math模块学习笔记
May 18 Python
python 捕获shell脚本的输出结果实例
Jan 04 Python
你真的了解Python的random模块吗?
Dec 12 Python
Python3计算三角形的面积代码
Dec 18 Python
python人民币小写转大写辅助工具
Jun 20 Python
对python 读取线的shp文件实例详解
Dec 22 Python
python实现批量视频分帧、保存视频帧
May 31 Python
Python类中的魔法方法之 __slots__原理解析
Aug 26 Python
pygame实现俄罗斯方块游戏(对战篇1)
Oct 29 Python
Python使用正则实现计算字符串算式
Dec 29 Python
一文读懂python Scrapy爬虫框架
Feb 24 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 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获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
php获取301跳转URL简单实例
2013/12/16 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
jquery实现文字由下到上循环滚动的实例代码
2013/08/09 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
[02:04]完美世界城市挑战赛秋季赛报名开始 谁是solo路人王?
2019/10/10 DOTA
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
python生成随机密码或随机字符串的方法
2015/07/03 Python
Python中操作mysql的pymysql模块详解
2016/09/13 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
python sorted函数的小练习及解答
2019/09/18 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
django有哪些好处和优点
2020/09/01 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
巴西购物网站:Submarino
2020/01/19 全球购物
Zatchels官网:英国剑桥包品牌
2021/01/12 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
应聘会计求职信
2014/06/11 职场文书
无房证明范本
2014/09/17 职场文书
大雁塔导游词
2015/02/04 职场文书
培训感想范文
2015/08/07 职场文书
JavaScript的Set数据结构详解
2022/02/18 Javascript
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers