簡體   English   中英

Python閉包

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM