問題
之前一個同學寫 python 時遇到了一個錯誤,我看了 python 的報錯提示派阱,如下:
UnboundLocalError: local variable 'lst' referenced before assignment
當時覺得是和 python 的命名空間有關。他那句代碼寫在一個 for 循環(huán)里文兑,for 又在一個函數(shù)里,因此我武斷的覺得應該是 for 里的命名空間和函數(shù)里的命名空間不同绿贞,函數(shù)里的命名空間只能往上走,不能往下走籍铁,也就是說在 for 外面的變量不能在 for 里面進行操作。這時旁邊一個老板說不是這樣拒名。所以回來之后我就去找了相關資料,發(fā)現(xiàn)確實不是那樣增显。
命名空間
python 的命名空間主要有三層:
- 局部命名空間: 函數(shù),類
- 全局命名空間: 模塊
- 內置命名空間: 系統(tǒng)
查找順序是 局部=》全局=》內置
命名空間的生命周期
- 局部的在返回結果同云,拋出異常,被刪除就結束了炸站。
- 全局的在 import 時創(chuàng)建,保存到解釋器退出武契。
- 內置的在解釋器啟動時創(chuàng)建咒唆,保存到解釋器退出。
注意:
Python 的一個特別之處在于其賦值操作總是在最里層的作用域全释。賦值不會復制數(shù)據(jù)——只是將命名綁定到對象。刪除也是如此:"del y" 只是從局部作用域的命名空間中刪除命名 y 浸船。
--Python命名空間的本質
命名空間的訪問
- 局部命名空間: locals()
- 全局命名空間: glocals()
注意:
locals 實際上沒有返回局部名字空間寝蹈,它返回的是一個拷貝。所以對它進行改變對局部名字空間中的變量值并無影響箫老。
globals 返回實際的全局名字空間,而不是一個拷貝耍鬓。所以對 globals 所返回的 dictionary 的任何的改動都會直接影響到全局變量。
--Python命名空間的本質
參考
http://www.cnblogs.com/windlaughing/archive/2013/05/26/3100362.html