首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Python 變量作用域機制深度解析:local、nonlocal 與 global 關鍵字

     編輯:Java 相關知識

Python 作用域基礎:LEGB 規則

Python 採用詞法作用域,變量查找遵循 LEGB 原則:Local(局部) → Enclosing(嵌套) → Global(全局) → Built-in(內建)。理解這四層作用域是掌握 global 和 nonlocal 關鍵字的前提。

關鍵字行為對比演示

def scope_test():
    def do_local():
        spam = "local spam"  # 僅在 do_local 內部有效
    
    def do_nonlocal():
        nonlocal spam        # 修改外層 scope_test 的 spam
        spam = "nonlocal spam"
    
    def do_global():
        global spam          # 修改模塊級全局 spam
        spam = "global spam"
    
    spam = "test spam"       # scope_test 的局部變量
    do_local()
    print("After local assignment:", spam)   # 輸出: test spam
    
    do_nonlocal()
    print("After nonlocal assignment:", spam) # 輸出: nonlocal spam
    
    do_global()
    print("After global assignment:", spam)   # 輸出: nonlocal spam(注意:此處仍為 nonlocal 值)
    
scope_test()
print("In global scope:", spam)              # 輸出: global spam

執行結果詳解

階段輸出值說明
局部賦值後test spamdo_local 創建新局部變量,不影響外層
nonlocal 賦值後nonlocal spam修改了 scope_test 的 spam 綁定
global 賦值後nonlocal spamscope_test 內打印仍為其局部值,全局值已改變
全局作用域global spam模塊級 spam 被 global 修改

核心區別總結

  • local(默認):函數內賦值默認創建局部變量,無法修改外層同名變量
  • nonlocal:Python 3 新增,用於嵌套函數中修改外層(非全局)變量綁定
  • global:聲明使用模塊級全局變量,賦值將改變全局綁定

實戰應用:計數器閉包

def make_counter():
    count = 0
    def counter():
        nonlocal count
        count += 1
        return count
    return counter

mc = make_counter()
print(mc())  # 1
print(mc())  # 2
print(mc())  # 3

nonlocal 使內部函數能修改外層函數的變量,構成閉包,實現狀態保持。這是函數式編程中常用模式。

最佳實踐建議

  1. 優先使用局部變量,減少副作用
  2. 需修改外層變量時显式聲明 nonlocal
  3. 極少數情況下使用 global,優先考慮類或模塊級單例模式
  4. 避免同名變量跨作用域,降低認知負荷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved