浅析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的chardet库获得文件编码并修改编码
Jan 22 Python
Python 'takes exactly 1 argument (2 given)' Python error
Dec 13 Python
Python(Django)项目与Apache的管理交互的方法
May 16 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
python可视化爬虫界面之天气查询
Jul 03 Python
python中hasattr()、getattr()、setattr()函数的使用
Aug 16 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
Python 复平面绘图实例
Nov 21 Python
简单了解django文件下载方式
Feb 10 Python
Python unittest单元测试框架及断言方法
Apr 15 Python
Pytorch转tflite方式
May 25 Python
Python调用C语言程序方法解析
Jul 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
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
jQuery中:text选择器用法实例
2015/01/03 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
2018/01/04 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
python读取几个G的csv文件方法
2019/01/07 Python
python实现维吉尼亚加密法
2019/03/20 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
python3 字符串知识点学习笔记
2020/02/08 Python
appium+python adb常用命令分享
2020/03/06 Python
Selenium使用Chrome模拟手机浏览器方法解析
2020/04/10 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
白酒业务员岗位职责
2013/12/27 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
2014年党员发展工作总结
2014/12/02 职场文书
毕业生登记表班级意见
2015/06/05 职场文书