首頁 > 後端開發 > Python教學 > 為什麼 Python 在巢狀函數中拋出'UnboundLocalError”,以及如何解決?

為什麼 Python 在巢狀函數中拋出'UnboundLocalError”,以及如何解決?

Patricia Arquette
發布: 2024-12-23 08:20:22
原創
727 人瀏覽過

Why Does Python Throw an `UnboundLocalError` in Nested Functions, and How Can It Be Resolved?

UnboundLocalError:嵌套區塊中的過早變數賦值

使用巢狀函數作用域時,如提供的程式碼中所示,Python可能會遇到錯誤訊息「UnboundLocalError:賦值之前引用了局部變數『c』。」當在初始化之前引用嵌套區塊中分配的變數時,會發生此錯誤。

在範例程式碼中:

a, b, c = (1, 2, 3)

def test():
    print(a)
    print(b)
    c += 1  # UnboundLocalError here
登入後複製

程式碼嘗試列印變數 a、b 和c 在函數 test() 中。雖然 a 和 b 是全域變數並且可以直接訪問,但 c 存在於函數的局部範圍內。結果,賦值 c = 1 創建了一個局部變數 c,它覆蓋了同名的全域變數。

程式碼執行時,Python 初始化 a 和 b 並繼續呼叫 test()。在 test() 中,它成功列印 a 和 b,但在給局部變數 c 賦值之前嘗試列印它,從而導致錯誤。

要解決此問題,必須明確聲明變數在分配任何值之前使用 global 關鍵字作為函數內的全域。這通知 Python 使用全域變數而不是建立本地變數。修正後的程式碼為:

a, b, c = (1, 2, 3)

def test():
    global c  # Declare 'c' as global
    print(a)
    print(b)
    c += 1
登入後複製

或者,在 Python 3 中,可以使用 nonlocal 關鍵字,它指的是具有同名變數的最近的封閉函數作用域。這允許修改在外部函數中聲明的非全域變數。使用非本地更新的程式碼將是:

a, b, c = (1, 2, 3)

def test():
    nonlocal c
    print(a)
    print(b)
    c += 1
登入後複製

以上是為什麼 Python 在巢狀函數中拋出'UnboundLocalError”,以及如何解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板