浅析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实现可自定义大小的截屏功能
Jan 20 Python
Sublime开发python程序的示例代码
Jan 24 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
Oct 26 Python
基于Python对数据shape的常见操作详解
Dec 25 Python
python实现画出e指数函数的图像
Nov 21 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
Feb 27 Python
Python基于gevent实现高并发代码实例
May 15 Python
python闭包与引用以及需要注意的陷阱
Sep 18 Python
Python中return函数返回值实例用法
Nov 19 Python
Python更改pip镜像源的方法示例
Dec 01 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 Python
python源文件的字符编码知识点详解
Mar 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
linux中cd命令使用详解
2015/01/08 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
vue之延时刷新实例
2019/11/14 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
[59:42]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
python中hashlib模块用法示例
2017/10/30 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
PyQt5每天必学之拖放事件
2020/08/27 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
Python中文编码知识点
2019/02/18 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
python map比for循环快在哪
2020/09/21 Python
最新销售员个人自荐信
2013/09/21 职场文书
写给保洁员表扬信
2014/01/08 职场文书
个人承诺书
2014/03/26 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
2014年教务工作总结
2014/12/03 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书
分家协议书范本
2016/03/22 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python