This inspection warns about local variables referenced before assignment.


關於 local variable 'has' referenced before assignment 問題

 

今天在django開發時,訪問頁面總是出現錯誤提示“
local variable 'has' referenced before assignment
”,查了一下資料,好像是說無法訪問這個變量,檢查一下代碼我的視圖是這樣寫的:

def MusicTable(request):
    MUSICIANS = [ 
        {'name': 'Django Reinhardt', 'genre': 'jazz'}, 
        {'name': 'Jimi Hendrix',     'genre': 'rock'}, 
        {'name': 'Louis Armstrong',  'genre': 'jazz'}, 
        {'name': 'Pete Townsend',    'genre': 'rock'}, 
        {'name': 'Yanni',            'genre': 'new age'}, 
        {'name': 'Ella Fitzgerald',  'genre': 'jazz'}, 
        {'name': 'Wesley Willis',    'genre': 'casio'}, 
        {'name': 'John Lennon',      'genre': 'rock'}, 
       {'name': 'Bono',             'genre': 'rock'}, 
       {'name': 'Garth Brooks',     'genre': 'country'}, 
       {'name': 'Duke Ellington',   'genre': 'jazz'}, 
       {'name': 'William Shatner',  'genre': 'spoken word'}, 
       {'name': 'Madonna',          'genre': 'pop'},]
    Mu=[]
    #預處理 判斷是否粗體顯示 ,模板只是呈現方式,不應該處理 判斷哪些是特殊顯示
    for m in MUSICIANS:
        if '' not in m['name']:
             has = True
        Mu.append({'name':m['name'],
                   'genre':m['genre'],
                   'is_important':m['genre'] in ('jazz','rock'),
                   'is_pretentious': ' ' not in  m['name'],}
                  )
    return render_to_response('Musictable.html', {'Mu': Mu,'has_pretentious':has,})

    猛地一看變量has應該是有賦值啊,我郁悶了。
    后來看到網上一個帖子說的也是這個問題
-------------------------------------------------------------------------------

程序大致是這樣的:

CONSTANT = 0

def modifyConstant() :
        print CONSTANT
        CONSTANT += 1
        return

if __name__ == '__main__' :
        modifyConstant()
        print CONSTANT

運行結果如下:
UnboundLocalError: local variable 'CONSTANT' referenced before assignment

看來,全局變量在函數modifyConstant中邊成了局部變量,似乎全局變量沒有生效?
做點修改:

CONSTANT = 0

def modifyConstant() :
        print CONSTANT
        #CONSTANT += 1
        return

if __name__ == '__main__' :
        modifyConstant()
        print CONSTANT

運行正常,看來函數內部是可以訪問全局變量的。
所以,問題就在於,因為在函數內部修改了變量CONSTANT,Python認為CONSTANT是局部變量,而print CONSTANT又在CONSTANT += 1之前,所以當然會發生這種錯誤。

那么,應該如何在函數內部訪問並修改全局變量呢?應該使用關鍵字global來修飾變量(有點像PHP):

CONSTANT = 0

def modifyConstant() :
        global CONSTANT
        print CONSTANT
        CONSTANT += 1
        return

if __name__ == '__main__' :
        modifyConstant()
        print CONSTANT

就這么簡單!

------------------------------------------------------------------------------------
看了上邊帖子內容,我有了一點啟發,仔細看一下我程序這里:
for m in MUSICIANS:
        if '' not in m['name']:
             has = True
        Mu.append({'name':m['name'],
                   'genre':m['genre'],
                   'is_important':m['genre'] in ('jazz','rock'),
                   'is_pretentious': ' ' not in  m['name'],}
                  )
    return render_to_response('Musictable.html', {'Mu': Mu,'has_pretentious':has,})

標紅的部分 ''中間沒有空格,而在這個循環中根本沒有一次能滿足if '' not in m['name']: 這個條件,所以在 return render_to_response('Musictable.html', {'Mu': Mu,'has_pretentious':has,}) 傳遞 has的時候,報錯。
解決辦法有兩個 一個是將if '' not in m['name']: 的''加上空格變成‘ ’。
第二個辦法在之前給has一個初始值 has=False。
---------------------
作者:jiangnanandi
來源:CSDN
原文:https://blog.csdn.net/jiangnanandi/article/details/3553243
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM