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-命名空间)