從Google Style Guide上詞法作用域:訂單可變參考和分配的嵌套函數
嵌套Python函數可以指在包圍 函數定義的變量,但是不能分配給他們。
此規範可以在這裏看到:
def toplevel():
a = 5
def nested():
# Tries to print local variable `a`, but `a` is created locally after,
# so `a` is referenced before assignment. You would need `nonlocal a`
print(a + 2)
a = 7
nested()
return a
toplevel()
# UnboundLocalError: local variable 'a' referenced before assignment
扭轉nested
兩個語句的順序擺脫這個問題:
def toplevel():
a = 5
def nested():
# Two statements' order reversed, `a` is now locally assigned and can
# be referenced
a = 7
print(a + 2)
nested()
return a
toplevel()
我的問題是,是什麼關於Python的實現,告訴第一個函數a
將在本地聲明(在print語句之後)?我的理解是,Python是逐行有效地解釋的。那麼,它不應該默認在代碼中尋找非本地a
?
具體地說就是,如果我是使用只是參考(不分配),
def toplevel():
a = 5
def nested():
print(a + 2)
nested()
return a
toplevel()
莫名其妙print語句知道要引用封閉函數定義的非本地a
。但如果我在之後分配給當地的a
,那麼該功能對於自己的功能來說就太聰明瞭。
也許OP意思是字節碼是按指令執行的,這是正確的。不是嗎? – direprobs
@direprobs:它不像你想象的那麼正確,因爲函數調用(明確的或者隱含在'+'之類的東西中)通常會導致字節碼指令在其他字節碼指令的中間執行,但無論如何,我認爲提問者確實意味着逐行。 – user2357112