浅析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中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
构建Python包的五个简单准则简介
Jun 15 Python
python UNIX_TIMESTAMP时间处理方法分析
Apr 18 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
Python程序中设置HTTP代理
Nov 06 Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 Python
使用python实现ANN
Dec 20 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
djano一对一、多对多、分页实例代码
Aug 16 Python
python opencv肤色检测的实现示例
Dec 21 Python
Python MNIST手写体识别详解与试练
Nov 07 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
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
Js sort排序使用方法
2011/10/17 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
Javascript如何判断数据类型和数组类型
2016/06/22 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
Python中用于返回绝对值的abs()方法
2015/05/14 Python
Python入门学习之字符串与比较运算符
2015/10/12 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
Numpy中的mask的使用
2018/07/21 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
高中生毕业自我鉴定
2013/10/10 职场文书
建筑专业自我鉴定
2013/10/22 职场文书
活动宣传策划方案
2014/05/23 职场文书
食品质检员岗位职责
2015/04/08 职场文书
奖励通知
2015/04/22 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python