前言

變數可供多個函式共同使用時,就稱為「全域變數」(Global variable)。
變數的有效時間一直到程式結束為止,全域變數必須被建立在所有函式的外面。
在函式內建立的變數,稱為「區域變數」(Local Variable) 。此類變數的有效範圍僅在該函式內,離開該函式時此類變數便由記憶體中被釋放掉消失了,下次再執行該敘述區段時,系統會重新配置記憶體給此類變數使用。

變數覆蓋

若全域變數與函式內的區域變數使用到相同名稱的變數,則在函式內會產生「變數覆蓋」的現象。兩個同名稱的變數,在記憶體內是佔用不同的位址,互不影響。當程式流程執行到函式時,就使用這個區域所建立的變數,大範圍的全域變數會保留其值,等程式流程離開這較小範圍的函式時,這個區域變數便會消失。待程式流程回到較大範圍程式時,全域變數會仍用原保留的值繼續運作。

[簡例] 建立兩個全域變數、兩個區域變數,其中有一個變數名稱相同。觀察程式執行時它們的有效範圍,並留意變數覆蓋時發生的情況。 (檔名:global01.py)

[結果]

---- 變數(全域)------------
v1 = 100, v2 = 200
 
-----變數(全域,區域)------
v1 = 31, v2 = 200, v3 = 33
 
---- 變數(全域)---------
v1 = 100, v2 = 200

global 宣告變數

若在函式內使用到全域變數,又要避免發生「變數覆蓋」的現象,則該全域變數在該函式內須用 global來宣告。如此這個變數無論在大範圍的主程式或在這小範圍的函式,在記憶體內是占用相同的位址。當程式流程執行這個函式時或離開這個函式時,這個變數皆一直保留其值。

[簡例] 建立兩個全域變數、一個區域變數,其中一個全域變變數要在函式內繼續使用且用global宣告。請觀察程式執行時變數值的變化。 (檔名:global02.py)

[結果]

----- main ----
n = 100, m = 200
---- subpro -----
n = 110, m = 20
----- main ----
n = 110, m = 200
---- subpro -----
n = 120, m = 20
----- main ----
n = 120, m = 200

相關主題與延伸閱讀

  • 3. 自定函式:了解函式的基本定義,作為變數作用範圍的先備知識。
  • 7. 遞迴:遞迴函式每次呼叫都會產生獨立的區域變數空間。
  • 4. 引數的傳遞方式:引數傳遞的方式也與變數的作用範圍息息相關。
  • 1. 何謂函式:函式模組化與變數作用範圍是密不可分的觀念。