Python四層變數作用域及跨域使用規則

變數的作用域決定了哪些程式碼塊可以使用這個該變數名稱。

四層變數作用域

Python變數一共有4個層次的作用域:

Python四層變數作用域及跨域使用規則

1) L(local)區域性作用域,只在本程式碼塊內有效

Ø 典型的,函式體的變數都是區域性變數

2) E(Enclosing)閉包作用域。

Ø 這是一種特殊的作用域,往往存在於巢狀函式的場景。

Ø 在外層函式內的一個區域性變數,相對於內層函式來說,就是一個閉包變數。

Ø (這種場景較少使用,函式內再巢狀一個函式,

誰會發神經這樣寫呢?

3) G(Global)全域性作用域,模組內或匯入該模組的程式都可以訪問

Ø 典型的,就是在函式體外的該模組內的變數就是全域性變數。

4) B(Built-in)內建作用域,任何程式皆可直接訪問

Ø 即Python內建函式所在模組的範圍,不需要明確匯入。

Ø 典型的系統屬性如__name__, __sepc__等就是內建變數。

Python四層變數作用域及跨域使用規則

變數的四層作用域

作用域使用規則

不同作用域的變數,在使用時應該遵循如下規則:

1) 本層作用域可直接讀取或修改本層定義的所有變數。

2) 下層作用域

可讀取

上層變數,但

不能修改(賦值)

上層變數。實際上,在下層作用域內賦值,相當於在下層重新定義了一個名稱相同的新的變數,從而覆蓋了上層變數的作用域。

3) 在下一層作用域內,可以重新定義一個與上層變數名相同的變數名,且互不影響。

4) 當在不同層次有相同變數名時,在使用變數時,變數的查詢順序是由本層向高層查詢。完整的順序是:L->E->G->B,即在區域性找不到,就會去區域性外的區域性去找,再找不到就去全域性找,最後在內建模組中去找。如果都找不到,才會丟擲NameError異常。

Python四層變數作用域及跨域使用規則

跨域修改變數

正常情況下,不能跨作用域(跨層)修改變數。其根因是,Python中變數定義語句和賦值語句是合一的,這使得變數修改有可能變成變數定義,進而使得不同作用域下的變數產生混亂。

在某些場景下,如果要跨作用域修改上層的變數,該怎麼辦?此時,需要使用特殊的關鍵字來進行變數宣告(Python好奇怪,變數不需要宣告即可賦值,這種情況下,卻是需要宣告的)。

1) 如果要修改全域性變數,需要使用global關鍵字宣告

2) 如果要修改閉包變數,需要使用nonlocal關鍵字宣告

3) 跨域變數在聲明後,才能夠被修改

Python四層變數作用域及跨域使用規則

Python四層變數作用域及跨域使用規則

歡迎聯絡我參加學習!

TAG: 作用域變數修改函式Python