[英]Python closures
def counter(x):
def _cnt():
#nonlocal x
x = x+1
print(x)
return x
return _cnt
a = counter(0)
print(a())
上面的代碼給出了以下錯誤
UnboundLocalError:賦值前引用的局部變量'x'
為什么這不能在_cnt的命名空間中創建值為'x + 1'的新對象並將其綁定到x。 我們將在兩個函數名稱空間中引用x
只要分配給定范圍內的名稱,同一范圍內對同一名稱的所有引用都是本地的。 因此,無法評估x + 1
(因為它試圖引用本地x
)。
因此這有效:
def f():
x = 42
def g():
print(x)
g()
f()
但這不是:
def f():
x = 42
def g():
print(x)
x = 42
g()
f()
第一個print
有這個字節碼:
0 LOAD_GLOBAL 0 (print)
3 LOAD_DEREF 0 (x)
6 CALL_FUNCTION 1
9 POP_TOP
而第二個print
有這個:
0 LOAD_GLOBAL 0 (print)
3 LOAD_FAST 0 (x)
6 CALL_FUNCTION 1
9 POP_TOP
函數counter
和_cnt
的范圍不一樣。 即使它們是嵌套的,也沒關系。
所以_cnt
中不存在counter
中的x
。 也許把它作為一個論點傳遞(或者使用nonlocal
,正如你似乎已經理解的那樣)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.