locals()和globals()如何控制Python變量的范圍
Python 編程中,變量的作用域(scope)非常重要,因為決定了變量在程序中的可訪問性和生命周期。對于一些高級用法,常常會遇到 locals() 和 globals() 這兩個函數,可以幫助控制和查詢變量的作用域,尤其是在動態代碼執行和調試過程中。那么,locals() 和 globals() 是如何工作的呢?它們分別有什么作用?
1.作用域是什么?
在 Python 中,作用域指的是變量和函數可以訪問的區域。Python 中有四種常見的作用域,它們分別是:
-
局部作用域(Local scope):在函數或代碼塊內部定義的變量。
-
封閉作用域(Enclosing scope):位于嵌套函數外部但又包含在內部函數中的作用域。
-
全局作用域(Global scope):在模塊層面定義的變量。
-
內置作用域(Built-in scope):Python 內置函數和模塊的作用域。
locals() 和 globals() 這兩個函數幫助我們訪問和操控這些作用域中的變量。
2.globals() 函數
globals() 函數返回一個字典,表示當前模塊的全局符號表。簡單來說,它提供了一個可以訪問全局變量和函數的字典。使用 globals(),我們可以動態地查詢、修改或添加全局變量。
示例:使用 globals() 查詢和修改全局變量
x = 10 # 全局變量
def test_globals():
print(globals()) # 打印當前的全局字典
test_globals()
輸出:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class 'runpy._RunModuleContext'>, ... , 'x': 10} 從輸出中可以看到,字典中包含了全局變量 x,還包括其他全局信息(如模塊名稱等)。
修改全局變量:
x = 10 # 全局變量
def test_globals():
globals()['x'] = 20
print(x) # 輸出: 20
test_globals()
可以使用 globals() 來修改全局變量。通過將字典中的鍵(變量名)設置為新值,我們就成功地修改了全局變量。
3.locals() 函數
locals() 函數返回一個字典,表示當前局部符號表。與 globals() 類似,locals() 允許我們訪問和修改局部變量。在函數內部使用時,它返回當前函數的局部變量字典。
示例:使用 locals() 查詢局部變量
def test_globals():
a = 5
b = 10
print(locals())
test_globals()
輸出: {'a': 5, 'b': 10} 我們看到 locals() 返回的是當前函數的局部變量字典,包含了 a 和 b。
修改局部變量:
注意,雖然 locals() 可以用來查詢局部變量,但直接通過它修改局部變量并不總是有效。因為 locals() 返回的是對局部變量的一個“視圖”,而不是直接的可修改對象。
def test_locals():
a = 5
locals()['a'] = 10
print(a) # 輸出: 5
test_locals()
直接通過 locals() 修改變量并沒有成功更新 a 的值。
4.locals() 與 globals() 的區別
作用域
-
globals() 操作的是全局符號表,可以訪問和修改全局變量。
-
locals() 操作的是局部符號表,通常用于查詢局部變量。
修改行為
-
globals() 中的變量可以直接通過字典修改。
-
locals() 中的變量修改受限,在某些情況下不能直接通過 locals() 修改局部變量。
使用場景
-
globals() 用于需要動態操作全局變量的場景,比如在調試時修改全局變量。
-
locals() 更適合在函數內部使用,尤其是在調試時查看局部變量的值。
5.應用示例:動態創建變量
有時候可能需要在運行時動態創建變量或修改變量的值,這時就可以利用 globals() 或 locals() 來實現。
def dynamic_variable(name, value):
globals()[name] = value # 動態創建全局變量
dynamic_variable('new_var', 100)
print(new_var) # 輸出: 100
這個例子演示了如何通過 globals() 動態創建全局變量。

浙公網安備 33010602011771號