理解Python 3 中的「非本地」
與傳統語言不同,Python 允許巢狀函數存取在其外部作用域中定義的變數。但是,存取巢狀函數中未宣告的變數(即非局部變數)可能會導致意外行為。
「非局部」關鍵字
中Python 3 中,「nonlocal」關鍵字可讓您修改巢狀函數內外部作用域中宣告的變數。透過使用“nonlocal”,您可以聲明您正在修改的變數是非本地的,並且屬於外部作用域。
“nonlocal”如何工作
考慮以下代碼不使用"nonlocal":
x = 0 def outer(): x = 1 def inner(): x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x)
輸出:
inner: 2 outer: 1 global: 0
在此範例中,內部函數中的變數x 遮蔽了外部函數的變數x,導致值 2被指派給x 在內部函數中。外部函數的變數 x 不受影響。
使用 "nonlocal"
要從內部函數修改外部函數的變數 x,我們可以使用 "nonlocal"如下:
x = 0 def outer(): x = 1 def inner(): nonlocal x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x)
輸出:
inner: 2 outer: 2 global: 0
在這種情況下,「nonlocal」關鍵字允許內部函數存取和修改外部函數的變數 x。結果,外部函數中 x 的值改為 2。
與「global」的比較
與「nonlocal」不同,「global」關鍵字指的是屬於全域範圍的變數。使用「global」會將內部函數中的變數綁定到全域變量,無論是否存在其他同名局部變數:
x = 0 def outer(): x = 1 def inner(): global x x = 2 print("inner:", x) inner() print("outer:", x) outer() print("global:", x)
輸出:
inner: 2 outer: 1 global: 2
因此,當您想若要修改在外部作用域中宣告的變數時,應使用“nonlocal”,而從全域作用域存取變數時應使用“global”。
以上是Python 的「nonlocal」關鍵字在修改變數時與「global」有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!