参考链接: Python命名空间和范围

写在之前

命名空间,又名 namesapce,是在很多的编程语言中都会出现的术语,估计很多人都知道这个词,但是让你真的来说这是个什么,估计就歇菜了,所以我觉得 “命名空间” 有必要了解一下。

全局变量 & 局部变量

全局变量和局部变量是我们理解命名空间的开始,我们先来看一段代码:

x = 2

def func():

x = 3

print('func x ---> ',x)

func()

print('out of func x ---> ',x)

这段代码输出的结果如下:

func x ---> 3

out of func x ---> 2

从上述的结果中可以看出,运行 func(),输出的是 func() 里面的变量 x 所引用的对象 3,之后执行的是代码中的最后一行。这里要区分清楚,前一个 x 输出的是函数内部的变量 x,后一个 x 输出的是函数外的变量 x,两个变量互相不影响,在各自的作用域中起作用。

那个只在函数内起作用的变量就叫 “局部变量”,有了 “局部” 就有相应的 “全部”,但是后者听起来有歧义,所以就叫了 “全局”。

x = 2

def func():

global x = 3 #注意此处

print('func x ---> ',x)

func()

print('out of func x ---> ',x)

这段代码中比上段代码多加了一个 global x,这句话的意思是在声明 x 是全局变量,通俗点说就是这个 x 和 函数外的 x 是同一个了,所以结果就成了下面这样:

func x ---> 3

out of func x ---> 3

这样乍一看好像全局变量好强,可以管着函数内外,但是我们还是要注意,全局变量还是谨慎使用的好,因为毕竟内外有别,不要带来混乱。

作用域

作用域,用比较直白的方式来说,就是程序中变量与对象存在关联的那段程序,比如我在上面说的, x = 2 和 x = 3 是在两个不同的作用域中。

通常的,作用域是被分为静态作用域和动态作用域,虽然我们说 Python 是动态语言,但是它的作用域属于静态作用域,即 Python 中的变量的作用域是由该变量所在程序中的位置所决定的。

在 Python 中作用域被划分成四个层级,分别是:local(局部作用域),enclosing(嵌套作用域),global(全局作用域)和 built - in(内建作用域)。对于一个变量,Python 也是按照之前四个层级依次在不用的作用域中查找,我们在上一段代码中,对于变量 x,首先搜索的是函数体内的局部作用域,然后是函数体外的全局作用域,至于这段话具体怎么来理解,请看下面的例子:

def out_func():

x = 2

def in_func():

x = 3

print('in_func x ---> ',x)

in_func()

print('out_func x ---> ',x)

x = 4

out_func()

print('x == ',x)

上述代码运行的结果是:

in_func x ---> 3

out_func x ---> 2

x == 4

仔细观察一下上面的代码和运行的结果,你就会发现变量在不同的范围内进行搜索的规律,是不是感觉这些都是以前被你忽略的呢?

命名空间

《维基百科》中说 “命名空间是对作用域的一种特殊的抽象”,在这里我用一个比方来具体说明一下:

比如张三在公司 A,他的工号是 111,李四在公司 B,他的工号也是 111,因为两个人在不同的公司,他们俩的工号可以相同但是不会引起混乱,这里的公司就表示一个独立的命名空间,如果两个人在一个公司的话,他们的工号就不能相同,否则光看工号也不知道到底是谁。

其实上面举的这个例子的特点就是我们使用命名空间的理由,在大型的计算机程序中,往往会出现成百上千的标识符,命名空间提供隐藏区域标识符的机制。通过将逻辑上相关的标识符构成响应的命名空间,可以使整个系统更加的模块化。

我在开头引用的《维基百科》的那句话说 “命名空间是对作用域的一种特殊的抽象”,它其实包含了处于该作用域内的标识符,且它本身也用一个标识符来表示。在 Python 中,命名空间本身的标识符也属于更外层的一个命名空间,所以命名空间也是可以嵌套的,它们共同生活在 “全局命名空间” 下。

简言之,不同的命名空间可以同时存在,但是彼此独立,互不干扰。当然了,命名空间因为其对象的不同也有所区别,可以分为以下几种:

本地命名空间:模块中有函数或者类的时候,每个函数或者类所定义的命名空间即是本地命名空间,当函数返回结果或者抛出异常的时候,本地命名空间也就结束了。  全局命名空间:每个模块创建了自己所拥有的全局命名空间,不同模块的全局命名空间彼此独立,不同模块中相同名称的命名空间也会因为模块的不同而不相互干扰。  内置命名空间:当 Python 运行起来的时候,它们就存在了,内置函数的命名空间都属于内置命名空间,所以我们可以在任何程序中直接运行它们。

程序查询命名空间的时候也有一套顺序,依次按照本地命名空间 ,全局命名空间,内置命名空间。

def fun(like):

name = 'rocky'

print(locals())

fun('python')

访问本地命名空间使用 locals 完成,我们来看一下结果:

{'name': 'rocky', 'like': 'python'}

从上面的结果中可以看出,命名空间中的数据存储的结构和字典是一样的。可能你已经猜到了,当我们要访问全局命名空间的时候,可以使用 globals。

关于命名空间还有一个生命周期的问题,就是一个命名空间什么时候出现,什么时候消失,这个很好理解,就是哪部分被读入内存,哪部分的命名空间就存在了,比如我们在上面说的,Python 启动,内置命名空间就建立。

写在之后

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。

[转载] 你真的知道什么是 Python“命名空间” 吗?相关推荐

  1. 你真的知道什么是 Python“命名空间” 吗?

    写在之前 命名空间,又名 namesapce,是在很多的编程语言中都会出现的术语,估计很多人都知道这个词,但是让你真的来说这是个什么,估计就歇菜了,所以我觉得 "命名空间" 有必要 ...

  2. [转载] Python命名空间和作用域

    参考链接: Python命名空间和范围 Python命名空间和作用域 Python作用域和命名空间命名空间作用域 全局变量和局部变量global和nonlocal关键字 Python作用域和命名空间 ...

  3. Python命名空间

    命名空间namespace 定义 我对于命名空间的理解是,由变量名到对象的一个映射,相当于字典中的key对应一个values.所以在同一个环境中,不能有相同的key,但在不同的环境中,key的值是可以 ...

  4. Python命名空间的本质

    Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则. 接下来我将分四部分揭示Python命名空间的本质:一.命名 ...

  5. python namespace,python命名空间(namespace)简单介绍

    python命名空间(namespace)简单介绍 发布时间:2020-09-08 07:20:33 来源:脚本之家 阅读:127 作者:人生与戏 命名空间: 每一个作用域变量存储的位置,或者解释为 ...

  6. 你真的知道什么是 Python「命名空间」吗?

    写在之前 命名空间,又名 namesapce,是在很多的编程语言中都会出现的术语,估计很多人都知道这个词,但是让你真的来说这是个什么,估计就歇菜了,所以我觉得「命名空间」 有必要了解一下. 全局变量 ...

  7. [转载] python 命名空间

    参考链接: Python中的命名空间和范围 命名空间,英文名字:namespaces 在研习命名空间以前,请打开在python的交互模式下,输入:import this >>> im ...

  8. 坦克大战python_Python语言学了没用?那只能说你是真的没有精通了Python语言

    [文末有福利] Python的热度一直高居不下,运维,自动化测试,后端开发,机器学习...Python的用武之地真的太多了! "人生苦短,我用Python",对于普通职场人士来说, ...

  9. Python 命名空间

    通俗的来说,Python中所谓的命名空间可以理解为一个容器.在这个容器中可以装许多标识符.不同容器中的同名的标识符是不会相互冲突的.理解python的命名空间需要掌握三条规则: 第一,赋值(包括显式赋 ...

最新文章

  1. 人工智能对地球环境科学的推进
  2. c# 委托和事件(总结篇)
  3. MySQL复制常用拓扑结构详解
  4. arcgis dem栅格立体感_如何使用ArcGIS从DEM数据中提取水系
  5. mysql增删改查脚本_脚本方式实现数据库增删改查
  6. android监听方法的耗时时间,Android从网络获取北京时间以及动态的监听时间
  7. 《Effective C#》Item 14:使用构造函数初始化语句
  8. iOS申请发布证书-图文详解
  9. nginx配置与常见错误解决方法
  10. UGUI 图片灰显裁剪
  11. POI jar包下载
  12. c语言ascii码表_零基础学C语言——变量、常量与数据类型
  13. Elasticsearch02
  14. python爬虫笔记(3)
  15. 使用 Applet 渲染 jzy3d WireSurface 波动率曲面图
  16. Codeforces 480D Parcels(dp)
  17. sql compact 转mysql_如何将数据导入到 SQL Server Compact Edition 数据库中(五)
  18. hive 窗口函数--常用函数介绍
  19. 完美云主机购买小技巧分享
  20. MSN登陆不了的解决方案

热门文章

  1. 【无标题】Vue项目添加网页背景图片
  2. php fopen 文件路径,php – 使用fopen()将文件写入子目录
  3. spring+shiro+cas实现单点登录,登出
  4. 彩色图像、灰度图像、索引图像和二值图像的区别
  5. 《网络安全0-100》安全事件案例
  6. nginx反向代理实现免备案
  7. 喜讯!热烈祝贺安科瑞DJSF1352-RN/D直流电能表取得UL证书
  8. AutoML工具对比与总结
  9. Oracle ODBC driver 驱动 官方 下载
  10. USACO黄金级 USACO白金级