iT邦幫忙

0

Python 的區域變數與全域變數

  • 分享至 

  • xImage
  •  

在 Python 中,變數的範圍會影響到它在程式中的可見性以及生命週期。
主要分為兩大類:區域變數 (local variable) 和全域變數 (global variable)。
但在開始說明前,先來說明什麼是Python 的作用域 (Scope)

什麼是作用域?

在 Python 中,作用域指的是一個變數名稱有效的範圍。簡單來說,就是一個變數在程式碼中的哪些地方可以被存取。

Python 的作用域類型

Python 的作用域主要分為以下幾種:

  • Local 作用域: 函數內定義的變數,只在函數內有效。
  • Enclosing 作用域: 包含非局部(non-local)且非全域的變數,通常在嵌套函數中出現。
  • Global 作用域: 模組層級的變數,在整個模組中都有效。
  • Built-in 作用域: 包含 Python 內建的函數和名稱,例如 print()len() 等。

作用域的查找順序

Python 在查找變數時,會按照以下順序搜尋:

  1. Local 作用域: 首先在當前函數內部查找。
  2. Enclosing 作用域: 如果在局部作用域找不到,則向上一層作用域查找。
  3. Global 作用域: 如果在前兩層都找不到,則在全局作用域查找。
  4. Built-in 作用域: 最後在內建作用域查找。
x = "global"  # 全局變數

def outer():
    y = "enclosing"  # 包含作用域變數

    def inner():
        z = "local"  # 局部變數
        print(x, y, z)  # 輸出:global enclosing local

    inner()

outer()

在上面的例子中:

  • x 是全局變數,可以在任何地方訪問。
  • y 是包含作用域變數,只能在 outer 函數和 inner 函數中訪問。
  • z 是局部變數,只能在 inner 函數中訪問。

區域變數 (local variable)

定義: 在函數內部定義的變數稱為區域變數。
作用域: 僅在定義它的函數內有效。
生命週期: 當函數執行完畢,區域變數就會被銷毀。

def my_function():
    x = 10  # x 是區域變數
    print(x)

my_function()
# 在函數外部嘗試訪問 x 會報錯,因為 x 只在 my_function 內有效

全域變數 (global variable)

定義: 在函數外部定義的變數稱為全域變數。
作用域: 在整個程式中都有效,包括在函數內。
生命週期: 從定義開始,直到程式結束。

x = 20  # x 是全域變數

def my_function():
    print(x)  # 在函數內可以直接訪問全域變數

my_function()
print(x)
x = 10  # 全域變數

def my_function():
    y = 20  # 區域變數
    print(x)  # 可以訪問全域變數
    print(y)  # 只能在函數內訪問

my_function()
print(x)  # 可以訪問全域變數
print(y)  # 會報錯,因為 y 是區域變數,在函數外部無法訪問

在函數內修改全域變數:global 關鍵字

為什麼需要global關鍵字?
一般來說,在函數內部,我們無法直接修改函數外部定義的全域變數。
這是因為函數內部會創建一個新的命名空間,區域變數會優先於全域變數。

然而,如果我們確實需要在函數內修改全域變數,就必須使用global關鍵字來明確告訴 Python 解釋器,
我們要操作的是全域變數,而不是創建一個新的區域變數。

在函數內修改全域變數:
直接修改會產生一個新的區域變數,並不會改變全域變數的值。
要修改全域變數,需要使用global 關鍵字。

globe_x = 10

def change_global():
    global globe_x
    globe_x = 20

change_global()
print(globe_x)  # 输出 20

命名衝突: 如果區域變數和全域變數名稱相同,在函數內部會優先使用區域變數。

何時使用哪一種?

  • 區域變數:
    大部分情況下,應該優先使用區域變數,因為它們有助於將變數的作用範圍限制在函數內,避免命名衝突,提高程式碼的可讀性。
  • 全域變數:
    某些情況下,需要在多個函數中共享數據,可以使用全域變數。
    但過多的全域變數會使程式碼變得複雜,難以維護,因此應該謹慎使用。

小結

區域變數和全域變數是 Python 中非常重要的概念。
理解它們的作用範圍和生命週期,有助於寫出更清晰、更易於維護的程式碼。
在一般情況下,應該優先使用區域變數,並儘量避免過多地使用全域變數。

  • 建議:盡量避免使用 global 關鍵字
    儘量避免使用過多全域變數,因為這會增加程式碼的耦合性,使得程式難以測試和維護。
    如果需要在多個函數中共享數據,可以考慮使用類或模組來管理這些數據。
    在函數內部修改全域變數時,一定要謹慎,因為這可能會導致意想不到的副作用。

使用 global 關鍵字會直接操作全域變數,修改後的結果會反映在程式的所有部分。

  • 替代方案: 如果需要在函數之間共享數據,可以考慮使用類、模組或函數的返回值來傳遞數據,而不是直接修改全域變數。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言