如何在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 資源
透過相關的互動式教學、備忘單和程式碼比較來擴展您的知識。