如何在Python中使用全域變數(global關鍵字)

了解全域變數在 Python 中的工作原理。了解變數作用域、本地命名空間與全域命名空間,以及如何使用 global 關鍵字修改變數。

在編輯器中嘗試此解決方案

概述

了解命名空間和變數作用域對於用 Python 編寫無錯誤的軟體至關重要。範圍決定了程式的哪些部分可以存取或修改變數。在所有函數之外聲明的變數存在於全域範圍內,並且可以在模組中的任何位置讀取。

但是,當函數嘗試修改(重新分配)全域變數時,就會出現問題。預設情況下,當 Python 在函數內部看到賦值時,它假定該變數是該函數的局部變數。如果您嘗試修改全域變數而不將其宣告為全域變量,Python 將建立一個同名的局部變量,保持全域變數不變(或引發「UnboundLocalError」)。

要明確告訴 Python 您想要修改全域命名空間中的變數而不是建立本機變量,您必須在函數內使用「global」關鍵字聲明它。雖然有時需要使用全域變量,但在大型軟體設計中通常認為這是一種不好的做法,因為它使狀態難以追蹤和調試。

程式碼和執行輸出

該腳本演示了讀取全域變數、變數遮蔽陷阱以及使用 global 關鍵字修改全域變數。

global_variables.py
在編輯器中嘗試
counter = 10 # Global variable

def read_counter():
    # Reading a global variable works out-of-the-box
    print("Reading global counter:", counter)

def shadow_counter():
    # Attempting to assign without 'global' creates a local variable
    counter = 20 # Shadowing
    print("Inside shadow function:", counter)

def modify_counter():
    global counter # Declaring we are writing to global scope
    counter = 50
    print("Inside modify function:", counter)

read_counter()
shadow_counter()
print("Counter after shadow function:", counter) # Remains 10

modify_counter()
print("Counter after modify function:", counter) # Now 50
端子輸出
Reading global counter: 10
Inside shadow function: 20
Counter after shadow function: 10
Inside modify function: 50
Counter after modify function: 50

逐步實施

  • 聲明需要在任何函數作用域之外全域存取的變數。
  • 讀取任何函數內的全域變量,無需添加特殊聲明。
  • 如果需要修改全域變數值,請在函數內使用 global 關鍵字(例如全域計數器)。
  • 限制全域變數的使用,以防止範圍混亂和命名空間污染。

常見問題解答

Python 中的變數陰影是什麼?

當局部作用域(如函數)內宣告的變數與外部全域作用域中的變數同名時,就會發生遮蔽。局部變量掩蓋了全域變量,使其在該範圍內暫時無法存取。

全域關鍵字和非本地關鍵字有什麼差別?

global 用於存取最外層模組範圍中定義的變數。 nonlocal 在巢狀函數內部使用來存取封閉(外部)函數作用域中定義的變數。

相關主題

推薦的 Python 資源

透過相關的互動式教學、備忘單和程式碼比較來擴展您的知識。