關於 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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!