[Python]自學 Python 100 天,全域變數、區域變數(global、nonlocal)

前言

之前只知道有 global 不知道有 nonlocal,這便先簡單說明,當一個變數要使用到關鍵字 global 時,此變數本身為 全域變數,在函數外先被定義

當變數使用到關鍵字 nonlocal 時,該變數為局部變數,為函數內定義的變數

某函數要修改全域變數,則要使用關鍵字 global。 某函數要修改上一層函數定義的局部變數,要用 nonlocal

global範例

global範例 - 定義全域變數

# 定義全域變數
GA = 77

def fun1():
    print('全域變數可直接獲取:', GA)

fun1()

global範例 - 使用 global 修改全域變數

# 定義全域變數
GA = 77

def fun1():
    # print('全域變數可直接獲取:', GA)  # GA 不可於 global GA 前使用

    # 若要修改全域變數,必須先用關鍵字 global 說明該函數要修改全域變數
    # 此外,使用 global 前,全域變數不可被使用,否則報錯
    global GA
    GA = 80
    print('全域變數可直接獲取,修改後:', GA)

print('fun1()前,全域變數 GA = ', GA)
fun1()
print('fun1()後,全域變數 GA = ', GA)

nonlocal 範例

global 是函數宣告自己要修改哪個全域變數,而 nonlocal 則是函數宣告自己要修改上層(不侷限於前一層)函數中定義的變數

nonlocal範例 - 定義局部變數

# 定義巢狀函數第一層 fun2()
def fun2():
    # 定義局部變數
    a = 10
    print('fun2 的局部變數 a =', a)

    # 定義巢狀函數第二層 fun3()
    def fun3():
        print('fun3 呼叫上層定義的局部變數 a =', a)

        # 定義巢狀函數第三層 fun4()
        def fun4():
            print('fun4 呼叫上層定義的局部變數 a =', a)

        fun4()  # fun3 呼叫 fun4

    fun3()  # fun2 呼叫 fun3
    print('fun2 的變數 a 結果:', a)


# 執行函數
fun2()

nonlocal範例 - 使用 nonlocal 修改局部變數

若是在巢狀函數內,直接修改變數,則受影響的只有自己那層級之後(包含自己)。

所以要透過關鍵字 nonlocal 說明函數即將修改先前定義過的局部變數,程式碼以及結果如下:

# 定義巢狀函數第一層 fun2()
def fun2():
    # 定義局部變數
    a = 10
    print('fun2 的局部變數 a =', a)

    # 定義巢狀函數第二層 fun3()
    def fun3():
        print('fun3 呼叫上層定義的局部變數 a =', a)

        # 定義巢狀函數第三層 fun4()
        def fun4():
            # print('fun4 呼叫上層定義的局部變數,修改前 a =', a)
            
            # 透過關鍵字 nonlocal 說明函數要修改上層函數定義的局部變數
            nonlocal a
            a = 90
            print('fun4 呼叫上層定義的局部變數,修改後 a =', a)

        fun4()  # fun3 呼叫 fun4

    fun3()  # fun2 呼叫 fun3
    print('fun2 的變數 a 結果:', a)


# 執行函數
fun2()

小提醒

注意,在 fun4() 中,透過 nonlocal 修改 fun2() 定義的局部變數 a,對於 fun4() 而言,變數 a 是其上層函數定義的局部變數,而不是全域變數

但因為 變數 afun4() 之前就定義了,故我們仍可將 nonlocal 改成 global,這樣會使得 fun4() 的變數 a 變動,而不影響 fun3()fun2() 的變數 a同時會在函數外部,建立一個全域變數 a,如下:

標籤:

更新時間:

留言