起初是羣裏一個哥們這句話報錯。
後來以前的一個實習生,給出了連接來解釋這個問題。 我居然沒看懂....python
http://stackoverflow.com/questions/89347...閉包
代碼以下:函數
def foo1(tmp =None): def foo(): if tmp: print tmp else : tmp = None return foo()
其實這個代碼不能很好的反應問題。來看如下兩個casecode
def foo1(var1 =None): def foo(): var1 = 1 + 1 print var1 return foo() def foo3(tmp=None): def foo(): c = tmp tmp = 1 + 1 return foo()
我一開始沒理解這個問題。看到assign variable 和access variable 粗略的理解成不可以在閉包函數中改變上層函數的變量。但... 根本不是這回事。get
其實是, 若是一個變量被賦值,那麼python會認爲其爲局部變量。局部變量只會在當前函數空間來找到變量(就是foo函數內)
,因此能夠看到,在foo3中,解析器看到tmp = 1+1 就認爲 tmp 爲局部變量,而後想起來以前好像用過tmp,c= tmp ,發現tmp 在這句以前沒有被定義因此報錯了。io