變數的作用域決定了哪些程式碼塊可以使用這個該變數名稱。
四層變數作用域
Python變數一共有4個層次的作用域:
1) L(local)區域性作用域,只在本程式碼塊內有效
Ø 典型的,函式體的變數都是區域性變數
2) E(Enclosing)閉包作用域。
Ø 這是一種特殊的作用域,往往存在於巢狀函式的場景。
Ø 在外層函式內的一個區域性變數,相對於內層函式來說,就是一個閉包變數。
Ø (這種場景較少使用,函式內再巢狀一個函式,
誰會發神經這樣寫呢?
)
3) G(Global)全域性作用域,模組內或匯入該模組的程式都可以訪問
Ø 典型的,就是在函式體外的該模組內的變數就是全域性變數。
4) B(Built-in)內建作用域,任何程式皆可直接訪問
Ø 即Python內建函式所在模組的範圍,不需要明確匯入。
Ø 典型的系統屬性如__name__, __sepc__等就是內建變數。
變數的四層作用域
作用域使用規則
不同作用域的變數,在使用時應該遵循如下規則:
1) 本層作用域可直接讀取或修改本層定義的所有變數。
2) 下層作用域
可讀取
上層變數,但
不能修改(賦值)
上層變數。實際上,在下層作用域內賦值,相當於在下層重新定義了一個名稱相同的新的變數,從而覆蓋了上層變數的作用域。
3) 在下一層作用域內,可以重新定義一個與上層變數名相同的變數名,且互不影響。
4) 當在不同層次有相同變數名時,在使用變數時,變數的查詢順序是由本層向高層查詢。完整的順序是:L->E->G->B,即在區域性找不到,就會去區域性外的區域性去找,再找不到就去全域性找,最後在內建模組中去找。如果都找不到,才會丟擲NameError異常。
跨域修改變數
正常情況下,不能跨作用域(跨層)修改變數。其根因是,Python中變數定義語句和賦值語句是合一的,這使得變數修改有可能變成變數定義,進而使得不同作用域下的變數產生混亂。
在某些場景下,如果要跨作用域修改上層的變數,該怎麼辦?此時,需要使用特殊的關鍵字來進行變數宣告(Python好奇怪,變數不需要宣告即可賦值,這種情況下,卻是需要宣告的)。
1) 如果要修改全域性變數,需要使用global關鍵字宣告
2) 如果要修改閉包變數,需要使用nonlocal關鍵字宣告
3) 跨域變數在聲明後,才能夠被修改
歡迎聯絡我參加學習!