標籤:交易 範圍 strong enc bytearray 對象 關鍵字 global uil
命名空間的小弟範圍
在這要明確一個觀點,在Python中萬物皆對象,而變數指向的就是對象。
變數可以是 類名,函數名,儲存資料的變數……
對象可以是 類 ,被封裝的一段代碼(函數),資料……
命名空間
命名空間是從名字到對象的映射。在Python大多數命名空間目前以字典的形式實現。變數名是“鍵”,對象(內建函數,內建常量,內建類型,函數,類,變數)是“值”。
各個命名空間是獨立的,沒有任何關係的,所以一個命名空間中不能有重名,但不同的命名空間是可以重名而沒有任何影響。
命名空間都是有建立時間和生存期的。對於Python built-in namespace(內建命名空間——內建函數,內建常量,內建類型)組成的命名空間,它在Python解譯器啟動的時候被建立,在解譯器退出的時候才被刪除;
對於一個Python 模組的global namespace(全域變數),它在這個模組被 引用的時候建立,在解譯器退出的時候退出;
對於一個函數的local namespace(局部範圍),它在函數每次被調用的時候建立,函數返回的時候被刪除。
範圍
範圍只是命名空間表示大小(適用範圍)的屬性。
範圍是Python程式(文本)的某一段或某些段,在這些地方,某個命名空間中的名字可以被直接引用。這個範圍就是這個命名空間的範圍。
python中的範圍分4種情況:
- L:local,局部範圍,即函數中定義的變數;
- E:enclosing,嵌套的父級函數的局部範圍,即包含此函數的上級函數的局部範圍,但不是全域的;
- G:globa,全域變數,就是模組層級別定義的變數;
- B:built-in,系統固定模組裡面的變數,比如int, bytearray等
搜尋變數的優先順序順序
局部範圍>外層範圍>當前模組中的全域>python內建範圍,也就是L>E>G>B。
B = str("B:built-in 內建範圍")G = "G:globa,全域變數,就是模組層級別定義的變數"print(B) # 當前模組中的全域>python內建範圍 找Bprint(G) # 當前模組中的全域 找Gprint(E) # 找不到Eprint(L) # 找不到Ldef f(): E = "E:enclosing,嵌套的父級函數的局部範圍" print(B) # 外層範圍>當前模組中的全域>python內建範圍 找B print(G) # 外層範圍>當前模組中的全域 找G print(E) # 外層範圍 找E print(L) # 找不到L def z (): L = "L:local,局部範圍,即函數中定義的變數" print(B) # 範圍局部>外層範圍>當前模組中的全域>python內建範圍 找B print(G) # 範圍局部>外層範圍>當前模組中的全域 找G print(E) # 範圍局部>外層範圍 找E print(L) # 範圍局部 找L
注意:在Python中,只有模組(module),類(class)以及函數(def、lambda)才會引入新的範圍,其它的代碼塊(如if、try、for等)是不會引入新的範圍的
變數的修改
在“範圍局部>外層範圍>當前模組中的全域>python內建範圍”中,更內層的範圍不可直接修改外層的範圍的變數,要修改要用到global關鍵字 和 nonlocal關鍵字
global關鍵字
當修改的變數是在全域範圍(global範圍)上的,就要使用global先聲明一下。
nonlocal關鍵字
global關鍵字聲明的變數必須在全域範圍上,不能嵌套範圍上,當要修改嵌套範圍(enclosing範圍,外層非全域範圍)就需要nonlocal關鍵字了
B = str("B:built-in 內建範圍")G = "G:globa,全域變數,就是模組層級別定義的變數"def f(): E = "E:enclosing,嵌套的父級函數的局部範圍" def z (): L = "L:local,局部範圍,即函數中定義的變數" global B B = "修改全域範圍的變數" nonlocal E E = "修改嵌套範圍的變數"
歡迎評論,番茄,雞蛋都砸過來吧!!!
我和Python的Py交易》》》》》》 命名空間的小弟範圍