浅析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打印scrapy蜘蛛抓取树结构的方法
Apr 08 Python
Python yield 使用方法浅析
May 20 Python
python实现关键词提取的示例讲解
Apr 28 Python
python3 实现对图片进行局部切割的方法
Dec 05 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
python两个_多个字典合并相加的实例代码
Dec 26 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 Python
python属于哪种语言
Aug 16 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支持页面回退的两种方法
2008/01/10 PHP
PHP HTML代码串 截取实现代码
2009/06/29 PHP
ajax 的post方法实例(带循环)
2011/07/04 PHP
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
php短址转换实现方法
2015/02/25 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
Laravel框架实现超简单的分页效果示例
2019/02/08 PHP
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
js 分页全选或反选标识实现代码
2011/08/09 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
基于Jquery实现万圣节快乐特效
2015/11/01 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
[01:11]辉夜杯战队访谈宣传片—CDEC.Y
2015/12/26 DOTA
python服务器端收发请求的实现代码
2014/09/29 Python
python使用正则表达式提取网页URL的方法
2015/05/26 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
python矩阵的转置和逆转实例
2018/12/12 Python
python装饰器常见使用方法分析
2019/06/26 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
python数据分析:关键字提取方式
2020/02/24 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
高中生家长会演讲稿
2014/01/14 职场文书
社区矫正工作方案
2014/06/04 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
2015军训通讯稿大全
2015/07/18 职场文书