浅析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下使用Txt2Html实现网页过滤代理的教程
Apr 11 Python
python过滤字符串中不属于指定集合中字符的类实例
Jun 30 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
Jul 06 Python
python ddt实现数据驱动
Mar 14 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
Django数据库连接丢失问题的解决方法
Dec 29 Python
Django的models中on_delete参数详解
Jul 16 Python
Python (Win)readline和tab补全的安装方法
Aug 27 Python
python中p-value的实现方式
Dec 16 Python
python中threading开启关闭线程操作
May 02 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
Jun 03 Python
python对输出的奇数偶数排序实例代码
Dec 04 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 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
php对象工厂类完整示例
2018/08/09 PHP
比Jquery的document.ready更快的方法
2010/04/28 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
python实现中文转换url编码的方法
2016/06/14 Python
Zabbix实现微信报警功能
2016/10/09 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
浅析Python 序列化与反序列化
2020/08/05 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
Jimmy Choo美国官网:周仰杰鞋子品牌
2018/06/08 全球购物
通息工程毕业生自荐信
2013/10/16 职场文书
建筑施工员岗位职责
2013/11/26 职场文书
化学实验员岗位职责
2013/12/28 职场文书
法院先进个人事迹材料
2014/05/04 职场文书
机关作风建设自查报告
2014/10/22 职场文书
《正比例》教学反思
2016/02/23 职场文书
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server