今天在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。