Python命名空间namespace及作用域原理解析


Posted in Python onJune 05, 2020

曾经学C++的时候,经常听到这个名词,它主要是为了避免命名冲突而产生的。

就像有A(4个苹果),B(6个苹果)两个人,10个苹果,如果只标签了苹果,你无法判断哪个苹果是属于哪个人的,因为标签都是一样的;但是如果标签是A.苹果,B.苹果,那么是不是很容易就知道了苹果是谁的了。

命名空间:提供了一种从名称到对象的映射;主要是通过字典来实现的。

在python中,函数、模块等都有自己的命名空间:

局部命名空间(local namespace):即函数中定义的名称 —— 包括函数中的变量、参数、局部变量等;

全局命名空间(global namespace):即模块中定义的名称 —— 包括模块中的变量、函数、类、参数、常量、导入(import)的模块等;

内置命名空间(built-in namespace):即python内置的名称 —— 包括各种内置函数、Exception等;

而,当python需要使用变量时,会在上述命名空间中依次查找,顺序是:

局部命名空间,全局命名空间、内置命名空间。

同一命名空间中不能有重名,但不同命名空间可以。

可以通过locals()、globals() 函数来获取命名空间的值(字典),在程序的不同位置执行结果不一定一致,因为结果是针对当前位置来说的。

locals()

globals()

Python命名空间namespace及作用域原理解析

可以通过字典形式获取其中的值:

Python命名空间namespace及作用域原理解析

作用域:可以理解为变量所起作用的范围,超出范围则某变量不能被使用。在python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则报错。Python 中只有模块(module),类(class)以及函数(def、lambda)才会产生新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会产生新的作用域的。

作用域可以分为四种:

Local:最内层,包含局部变量,一般指的是函数内部的作用域;

Enclosing:包含非局部但是也不是全局的变量,主要是嵌套时,外层函数的变量,那么相对内层函数来说,嵌套的外层函数中的变量既不是局部变量也不是全局变量。

Global:全局变量,例如当前模块中的全局变量。

Build-in:内置变量。

查找顺序一般是:Local--->Enclosing--->Global--->Build-in

def test1():
  x1 = 1    #Enclosing 作用域
  def test2():
    x2 = 1  #Local 作用域
    print('x2=',x2)
    x1 = 100 #很明显,外层作用域中的x1没有受到影响,因为这里的x1属于Local
    
  test2()
  return x1

aa = test1()
print('aa=',aa)

Python命名空间namespace及作用域原理解析

要想修改外层作用域(上层)的变量,需要用到global和nonlocal关键字。(注意,修改和访问不是一样的程度)

def test1():
  x1 = 1    #Enclosing 作用域
  def test2():
    x2 = 1  #Local 作用域
    print('x2=',x2)
    
    nonlocal x1
    x1 = 100 #通过nonlocal,将这里的x1作用域变化为Enclosing作用域,即影响到Enclosing作用域中的x1的值
    
  test2()
  return x1
aa = test1()
print('aa=',aa)

Python命名空间namespace及作用域原理解析

def test1():
  x1 = 1    # 这个x1属于Enclosing 作用域
  def test2():
    x2 = 1  #Local 作用域
    print('x2=',x2)
    
    global x1  # 这个x1属于全局作用域
    x1 = 100 #这里影响的是全局作用域中的x1值,并不会影响到Enclosing作用域中的值
    
  test2()
  return x1  #返回的是当前作用域Enclosing中的x1的值

aa = test1()
print('aa=',aa)
print('x1=',x1)

Python命名空间namespace及作用域原理解析

全局变量和局部变量

定义在函数内部的变量,拥有局部作用域,属于局部变量。

定义在函数外部的变量,拥有全局作用域,属于全局变量。

全局变量可以在整个全局作用域内访问,但是要修改的话,需要用到global关键字。

更细节一点,若涉及到class:

全局变量:一般在模块内、在所有函数外面、在class外面的变量。

局部变量:一般在函数内、在class的方法内(未加self修饰)的变量。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Saltstack快速入门简单汇总
Mar 01 Python
关于反爬虫的一些简单总结
Dec 13 Python
python实现单向链表详解
Feb 08 Python
python修改txt文件中的某一项方法
Dec 29 Python
itchat-python搭建微信机器人(附示例)
Jun 11 Python
python实现人工智能Ai抠图功能
Sep 05 Python
python web框架中实现原生分页
Sep 08 Python
Jupyter Notebook输出矢量图实例
Apr 14 Python
基于Python测试程序是否有错误
May 16 Python
python中rb含义理解
Jun 18 Python
Python可视化学习之seaborn调色盘
Feb 24 Python
python+pyhyper实现识别图片中的车牌号思路详解
Dec 24 Python
Python3内置函数chr和ord实现进制转换
Jun 05 #Python
Python 解决相对路径问题:"No such file or directory"
Jun 05 #Python
opencv之颜色过滤只留下图片中的红色区域操作
Jun 05 #Python
Python参数传递及收集机制原理解析
Jun 05 #Python
python如何进行矩阵运算
Jun 05 #Python
Opencv求取连通区域重心实例
Jun 04 #Python
Python中zip函数如何使用
Jun 04 #Python
You might like
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
JavaScript 在各个浏览器中执行的耐性
2009/04/06 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
js的回调函数详解
2015/01/05 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
javascript伸缩型菜单实现代码
2015/11/16 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
Vue实现简易计算器
2020/02/25 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
基于JavaScript实现轮播图效果
2021/01/02 Javascript
Python中的异常处理学习笔记
2015/01/28 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
澳大利亚网上书店:QBD
2021/01/09 全球购物
班级出游活动计划书
2014/08/15 职场文书
学生违纪检讨书200字
2014/10/21 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
2019财务毕业实习报告
2019/06/27 职场文书