修改封閉作用域中的變數:Python 式難題
在Python 中,作用域的概念控制著變數的可見度和可訪問性。在處理巢狀和封閉作用域時,修改外部作用域中的變數並不總是那麼簡單。
問題:UnboundLocalError
考慮以下程式碼片段:
def A(): b = 1 def B(): # Access 'b', no problem print(b) # Attempt to modify 'b' b = 2 # UnboundLocalError B() A()
這裡,變數b 是在B 的封閉範圍內定義的,但它不是全局的。嘗試在 B 中直接修改 b 會導致 UnboundLocalError,因為 b 未在 B 中宣告為局部變數。
解決方案:擁抱非全域作用域
在 Python 3 中,nonlocal 關鍵字發揮了作用。它允許您修改封閉的非全域範圍內的變數。
def A(): b = 1 def B(): nonlocal b b = 2 B() print(b) # Output: 2
Python 2 的替代方案:可變性來救援
雖然 Python 3 有方便的nonlocal 關鍵字,Python 2 沒有提供直接的解決方案。解決方法是使用可變物件(例如列表或字典)並改變它們的值,而不是重新分配變數。
def foo(): a = [] def bar(): a.append(1) bar() bar() print(a) # Output: [1, 1]
透過操作清單 a(它是一個物件),您實際上可以修改其內容,同時遵守 Python 2 的範圍規則。
以上是如何在Python中修改封閉作用域中的變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!