2013-08-27 31 views
1

下面的代碼按預期工作:Python的封鎖和變量查找

def f(): 
    def g(): 
     print(a) 
    a = 42 
    return g 
f()() 

g負荷a從它的關閉,一切都很好。

現在這段代碼與UnboundLocalError可怕地失敗。

def f(): 
    def g(): 
     print(a) 
     a = 43 
    a = 42 
    return g 
f()() 

望着dis,第一代碼調用LOAD_CLOSURE和第二個沒有。考慮到這一點,很明顯爲什麼會出現錯誤。然而,問題是這樣的:

python如何知道何時從閉包或從本地作用域中繪製變量? (考慮到print(a)a = 43之前。)

這個決定是否在編譯時進行? (嗯,好像是,考慮到print(a)a = 43

這篇文章不是關於nonlocalglobal關鍵字。

回答

5

在沒有nonlocalglobal聲明時,Python通過檢查變量賦值的函數來決定變量在字節碼編譯時是否是本地的。由於第二個示例在g中分配給a,a在該版本中爲g

+0

是的,這只是一個簡單的靜態檢查。 – Claudiu

+0

這是否意味着,在編譯期間,編譯器會跟蹤(A)訪問哪些變量,以及(B)哪些變量被分配到每個範圍中,並且如果(A)中有元素不在(B)中,它會升級查找? – Hyperboreus

+0

是的,很多。 – user2357112