浅析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从入门到精通(DAY 3)
Dec 20 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
Python图像处理之识别图像中的文字(实例讲解)
May 10 Python
Python3获取拉勾网招聘信息的方法实例
Apr 03 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 Python
Python如何调用JS文件中的函数
Aug 16 Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 Python
PyCharm下载和安装详细步骤
Dec 17 Python
Python基于smtplib模块发送邮件代码实例
May 29 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 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
神族 PROTOSS 概述
2020/03/14 星际争霸
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
PHP isset()与empty()的使用区别详解
2010/08/29 PHP
php实现图片添加水印功能
2014/02/13 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
使用js写的一个简易的投票
2013/11/27 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
法国购买隐形眼镜和眼镜网站:Optical Center
2019/10/08 全球购物
2014年反洗钱工作总结
2014/11/22 职场文书
人事聘任通知
2015/04/21 职场文书
四群教育工作总结
2015/08/10 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
Redis持久化与主从复制的实践
2021/04/27 Redis
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android