关于 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
版权声明:本文为博主原创文章,转载请附上博文链接!

This inspection warns about local variables referenced before assignment.的更多相关文章

  1. python 错误--UnboundLocalError: local variable '**' referenced before assignment

    val = 9 def test(flag): if flag: val = 1 else: print("test") return val if __name__ == '__ ...

  2. local variables referenced from a Lambda expression must be final or effectively final------理解

    前几天使用lamdba时,报了一个这个错,原因是在lamdba体中使用了一个变量,觉得很奇怪! 今天在读这本书的时候,又看到了这个解释,这里有了更深刻的理解,总结一下: 在jdk1.8之前在使用匿名内 ...

  3. Effective Java 45 Minimize the scope of local variables

    Principle The most powerful technique for minimizing the scope of a local variable is to declare it ...

  4. local variable 'xxx' referenced before assignment

    这个问题很囧,在外面定义了一个变量 xxx ,然后在python的一个函数或类里面引用这个变量,并改变它的值,结果报错local variable 'xxx' referenced before as ...

  5. Implicitly Typed Local Variables

    Implicitly Typed Local Variables It happens time and time again: I’ll be at a game jam, mentoring st ...

  6. 遇到local variable 'e' referenced before assignment这样的问题应该如何解决

    问题:程序报错:local variable 'e' referenced before assignment 解决:遇到这样的问题,说明你在声明变量e之前就已经对其进行了调用,定位到错误的地方,对变 ...

  7. RDO Stack Exception: UnboundLocalError: local variable 'logFile' referenced before assignment

    Issue: When you install RDO stack on CentOS, you may encounter following error. Error: [root@localho ...

  8. Python问题:UnboundLocalError: local variable 'xxx' referenced before assignment

    参考链接: http://blog.csdn.net/onlyanyz/article/details/45009697 https://www.cnblogs.com/fendou-999/p/38 ...

  9. 洗礼灵魂,修炼python(23)--自定义函数(4)—闭包进阶问题—>报错UnboundLocalError: local variable 'x' referenced before assignment

    闭包(lexical closure) 什么是闭包前面已经说过了,但是由于遗留问题,所以单独作为一个章节详解讲解下 不多说,看例子: def funx(x): def funy(y): return ...

随机推荐

  1. 经典的MySQL Duplicate entry报错注入

    SQL注射取数据的方式有多种: 利用union select查询直接在页面上返回数据,这种最为常见,一个前提是攻击者能够构造闭合的查询. Oracle中利用监听UTL_HTTP.request发起的H ...

  2. (55)C# windows 消息

    窗体捕获消息 namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeC ...

  3. 机器学习笔记--classification_report&精确度/召回率/F1值

    https://blog.csdn.net/akadiao/article/details/78788864 准确率=正确数/预测正确数=P 召回率=正确数/真实正确数=R F1 F1值是精确度和召回 ...

  4. js全局变量优点和缺点

    全局变量的优点:可以减少变量的个数,减少由于实际参数和形式参数的数据传递带来的时间消耗. 全局变量的缺点: (1)全局变量保存在静态存贮区,程序开始运行时为其分配内存,程序结束释放该内存.与局部变量的 ...

  5. 利用HTML制作一个简单的界面(工具HBuilder)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"><!--标题,里面填写 ...

  6. 构建局域网YUM仓库

    修改yum源为阿里云源 检验阿里云源是否正常 yum repolist Loaded plugins: fastestmirror Loading mirror speeds from cached ...

  7. 高级UI晋升之自定义View实战(五)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从自定义View利器Canvas和Paint来进行详解 一.Canvas ...

  8. Oracle中常见的Hint(一)

    Oracle中的Hint可以用来调整SQL的执行计划,提高SQL执行效率.下面分类介绍Oracle数据库中常见的Hint.这里描述的是Oracle11gR2中的常见Hint,Oracle数据库中各个版 ...

  9. Python之小测试:用正则表达式写一个小爬虫用于保存贴吧里的所有图片

    很简单的两步: 1.获取网页源代码 2.利用正则表达式提取出图片地址 3.下载 #!/usr/bin/python #coding=utf8 import re # 正则表达式 import urll ...

  10. Python之循环遍历

    range() 快输生成序列 利用 items()提取字典元素 在Python里,for循环后面是可以接一个else 的,在for循环正常结束时候,else 语句会被执行(while循环也是一样哦), ...