python-命名空间

问题

之前一个同学写 python 时遇到了一个错误,我看了 python 的报错提示,如下:

UnboundLocalError: local variable 'lst' referenced before assignment

当时觉得是和 python 的命名空间有关。他那句代码写在一个 for 循环里,for 又在一个函数里,因此我武断的觉得应该是 for 里的命名空间和函数里的命名空间不同,函数里的命名空间只能往上走,不能往下走,也就是说在 for 外面的变量不能在 for 里面进行操作。这时旁边一个老板说不是这样。所以回来之后我就去找了相关资料,发现确实不是那样。

命名空间

python 的命名空间主要有三层:

  1. 局部命名空间: 函数,类
  2. 全局命名空间: 模块
  3. 内置命名空间: 系统

查找顺序是 局部=》全局=》内置

命名空间的生命周期

  1. 局部的在返回结果,抛出异常,被删除就结束了。
  2. 全局的在 import 时创建,保存到解释器退出。
  3. 内置的在解释器启动时创建,保存到解释器退出。

注意:

Python 的一个特别之处在于其赋值操作总是在最里层的作用域。赋值不会复制数据——只是将命名绑定到对象。删除也是如此:"del y" 只是从局部作用域的命名空间中删除命名 y 。
--Python命名空间的本质

命名空间的访问

  1. 局部命名空间: locals()
  2. 全局命名空间: glocals()

注意:

locals 实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行改变对局部名字空间中的变量值并无影响。
globals 返回实际的全局名字空间,而不是一个拷贝。所以对 globals 所返回的 dictionary 的任何的改动都会直接影响到全局变量。
--Python命名空间的本质

参考

http://www.cnblogs.com/windlaughing/archive/2013/05/26/3100362.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 分四部分揭示Python命名空间的本质: 一、命名空间的定义 Python使用叫做命名空间的东西来记录变量的轨迹。...
    jiangmo阅读 394评论 0 1
  • 变量是拥有匹配对象的名字(标识符)。命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。一个P...
    DraculaWong阅读 873评论 0 0
  • 前言 前段时间写脚本的时候,在调用函数的时候,一直在想在python中函数的参数是传值还是传引用?先看一下下面两个...
    Allenware阅读 5,271评论 0 11
  • 好好学习,天天向上,今天是:2017.05.19 Python命名空间、作用域一直没看懂。这篇文是网上看到的,写的...
    Wakingup88688阅读 1,432评论 4 1
  • Python进阶 - 命名空间与作用域 写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的...
    理查德成阅读 1,259评论 3 8