浅析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处理python编码问题
Mar 13 Python
Python爬取Coursera课程资源的详细过程
Nov 04 Python
Python标准库内置函数complex介绍
Nov 25 Python
Python实现多线程抓取妹子图
Aug 08 Python
最大K个数问题的Python版解法总结
Jun 16 Python
ubuntu中配置pyqt4环境教程
Dec 27 Python
Python中常用的内置方法
Jan 28 Python
Apache,wsgi,django 程序部署配置方法详解
Jul 01 Python
python 字典套字典或列表的示例
Dec 16 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
python 爬取B站原视频的实例代码
Sep 09 Python
如何用Python搭建gRPC服务
Jun 30 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调用mysql存储过程
2007/02/14 PHP
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
php读取3389的脚本
2014/05/06 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
php发送邮件的问题详解
2015/06/22 PHP
php无序树实现方法
2015/07/28 PHP
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
pyqt和pyside开发图形化界面
2014/01/22 Python
Python正则表达式匹配ip地址实例
2014/10/09 Python
Python的Flask框架中web表单的教程
2015/04/20 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
python实现Decorator模式实例代码
2018/02/09 Python
python实现音乐下载器
2018/04/15 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
校园环保建议书
2014/05/14 职场文书
python 调用js的四种方式
2021/04/11 Python