python3的命名空间与作用域

日期:2020年1月17日
作者:Commas
注释:学习就是为了忘记,命名空间和作用域很重要,很多概念都是由此产生的……
如果您想了解更多有关Python的知识,那么请点《我的Python浅谈系列目录》



一、生活上的命名空间与作用域

不知你是否经历过这样一件事情,在一个班上有两个重名的人(比如说:张三),那么该如何区分这两个“张三”呢?这时候,你就不得不使用额外的信息加以区分他们,比方说第一组的张三,和第三组的张三,这样就非常明显的将两个张三给区分开来了,这个所谓的“第几组”的限定词就是我们今天要讨论的命名空间(namespace),而“第一组的张三”中的张三限定在第一组内,不会算作其他组,仅对第一组起作用,这个限定的范围就是我们所要讨论的作用域(scope)
在这里插入图片描述

二、程序中的命名空间与作用域

官方文档中关于命名空间的描述:
英文:A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。
中文:命名空间是从名称到对象的映射,大部分的命名空间都是通过Python字典来实现的。

在程序世界中,也经常碰到“生活中重名”的问题,为了解决这个标识符重名的问题,就引入了命名空间这个概念,在不同的命名空间中,是允许重名的,而且是没有影响的。

1、python3命名空间分类

分类 英文名 说明
内置命名空间 Built-in Namespace python语言内置的标识符,如内置函数print()等等
全局命名空间 Global Namespace 模块中定义的标识符,模块的变量、函数、类、导入的模块、模块级的变量和常量
局部命名空间 Local Namespace 函数中的变量和嵌套函数,类中的变量和方法

其中,这三个命名空间的关系图如下:
在这里插入图片描述
看图说话:

  1. 每个命名空间相对独立,不同的命名空间中标识符(变量)是允许重名的;
  2. 命名空间可以嵌套,嵌套的命名空间是可以直接访问外面的命名空间的标识符(变量),即由内而外,如“函数A命名空间”可以直接访问“全局命名空间”中的标识符(变量),也可以直接访问“内置命名空间”中的标识符(变量),反之不可以;
  3. 非嵌套的命名空间之间是不可以直接访问的,如函数A命名空间不可以直接访问函数B命名空间的标识符(变量);
  4. 在嵌套命名空间中,通常情况下仅允许由内向外的直接访问,但不允许直接修改(如若需要修改,可借助关键字global、nonlocal,一般不推荐使用);

2、python3作用域的分类

分类 英文 说明
全局作用域 Global Scope 作用于全局,如内置命名空间和全局命名空间的标识符
局部作用域 Local Scope 作用于局部,如局部命名空间的标识符

在这里插入图片描述
看图说话:

  1. A对B、C1和C2是“全局”,即B、C1和C2中可直接访问A中的变量;
  2. B对C1和C2是“全局”,即C1和C2中可直接访问B中的变量;
  3. C1与C2是“局部”,两者没有嵌套关系,互相对立,有点像集合中没有交集的感觉,所以两者不可以访问彼此的变量;
  4. 如线路一和线路二,对于找变量名,采用的是就近原则进行处理的,即所在命名空间有就用,没有就往上一层命名空间找,直至找到为止;如果到最外层的命名空间还是没有找到,那么就抛出异常。

本文参考:
https://www.runoob.com/python3/python3-namespace-scope.html


版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/104017595

发布了26 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_35844043/article/details/104017595