local variable 'var1' referenced before assignment

起初是羣裏一個哥們這句話報錯。
後來以前的一個實習生,給出了連接來解釋這個問題。 我居然沒看懂....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

相關文章
相關標籤/搜索