问题
之前一个同学写 python 时遇到了一个错误,我看了 python 的报错提示,如下:
UnboundLocalError: local variable 'lst' referenced before assignment
当时觉得是和 python 的命名空间有关。他那句代码写在一个 for 循环里,for 又在一个函数里,因此我武断的觉得应该是 for 里的命名空间和函数里的命名空间不同,函数里的命名空间只能往上走,不能往下走,也就是说在 for 外面的变量不能在 for 里面进行操作。这时旁边一个老板说不是这样。所以回来之后我就去找了相关资料,发现确实不是那样。
命名空间
python 的命名空间主要有三层:
- 局部命名空间: 函数,类
- 全局命名空间: 模块
- 内置命名空间: 系统
查找顺序是 局部=》全局=》内置
命名空间的生命周期
- 局部的在返回结果,抛出异常,被删除就结束了。
- 全局的在 import 时创建,保存到解释器退出。
- 内置的在解释器启动时创建,保存到解释器退出。
注意:
Python 的一个特别之处在于其赋值操作总是在最里层的作用域。赋值不会复制数据——只是将命名绑定到对象。删除也是如此:"del y" 只是从局部作用域的命名空间中删除命名 y 。
--Python命名空间的本质
命名空间的访问
- 局部命名空间: locals()
- 全局命名空间: glocals()
注意:
locals 实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行改变对局部名字空间中的变量值并无影响。
globals 返回实际的全局名字空间,而不是一个拷贝。所以对 globals 所返回的 dictionary 的任何的改动都会直接影响到全局变量。
--Python命名空间的本质
参考
http://www.cnblogs.com/windlaughing/archive/2013/05/26/3100362.html