python 错误--UnboundLocalError: local variable '**' referenced before assignment
1 val = 9 2 def test(flag): 3 if flag: 4 val = 1 5 else: 6 print("test") 7 return val 8 9 if __name__ == '__main__': 10 ret = test(0) 11 print(ret)
运行如下:
linux@linux-desktop:~$ python3.3 test.py
fuck
Traceback (most recent call last):
File "test.py", line 10, in <module>
ret = test(0)
File "test.py", line 7, in test
return val
UnboundLocalError: local variable 'val' referenced before assignment
解释如下:
1.意思:
本地变量xxx引用前没定义。
2.错误原因:
在于python没有变量的声明 , 所以它通过一个简单的规则找出变量的范围 :如果有一个函数内部的变量赋值 ,该变量被认为是本地的,所以如果有修改变量的值就会变成局部变量。
3.解决方法:用global关键字来进行说明该变量是全局变量
python代码:
val=9
def test(flag):
global
val
if
flag:
val = 1
else:
print(test)
return
val
本地变量xxx引用前没定义。
项目中遇到错误如下:
root@UA4300D-spa:~/hanhuakai/pro_07/0703/webview# python3 app.py
ERROR:tornado.application:Uncaught exception GET /top (192.168.2.144)
HTTPRequest(protocol='http', host='192.168.5.41:7777', method='GET', uri='/top', version='HTTP/1.1', remote_ip='192.168.2.144', headers={'Accept-Language': 'zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate', 'Host': '192.168.5.41:7777', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 5.1; rv:30.0) Gecko/20100101 Firefox/30.0', 'Connection': 'keep-alive', 'Referer': 'http://192.168.5.41:7777/', 'Cache-Control': 'max-age=0', 'If-None-Match': '"56b2971f04441fe9644324362487e88a84a776de"'})
Traceback (most recent call last):
File "/usr/lib/python3.2/site-packages/tornado/web.py", line 1218, in _when_complete
callback()
File "/usr/lib/python3.2/site-packages/tornado/web.py", line 1239, in _execute_method
self._when_complete(method(*self.path_args, **self.path_kwargs),
File "app.py", line 21, in get
self.render("top.htm")
File "/usr/lib/python3.2/site-packages/tornado/web.py", line 615, in render
html = self.render_string(template_name, **kwargs)
File "/usr/lib/python3.2/site-packages/tornado/web.py", line 722, in render_string
return t.generate(**namespace)
File "/usr/lib/python3.2/site-packages/tornado/template.py", line 278, in generate
return execute()
File "top_htm.generated.py", line 5, in _tt_execute
_tt_tmp = _tt_modules.Workstate() # top.htm:34
File "/usr/lib/python3.2/site-packages/tornado/web.py", line 1313, in render
rendered = self._active_modules[name].render(*args, **kwargs)
File "app.py", line 2043, in render
info = s.faultyinfo()
File "/usr/lib/python3.2/xmlrpc/client.py", line 1076, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python3.2/xmlrpc/client.py", line 1403, in __request
verbose=self.__verbose
File "/usr/lib/python3.2/xmlrpc/client.py", line 1117, in request
return self.single_request(host, handler, request_body, verbose)
File "/usr/lib/python3.2/xmlrpc/client.py", line 1132, in single_request
return self.parse_response(resp)
File "/usr/lib/python3.2/xmlrpc/client.py", line 1303, in parse_response
return u.close()
File "/usr/lib/python3.2/xmlrpc/client.py", line 648, in close
raise Fault(**self._stack[0])
xmlrpc.client.Fault: <Fault 1: "<class 'UnboundLocalError'>:local variable 'str_problem_in' referenced before assignment FILENAME: /usr/lib/python3.2/site-packages/ssapi/fm/faultyinfo.py LINE: 912 NAME: print_status_record">
ERROR:tornado.access:500 GET /top (192.168.2.144) 413.94ms
部分代码如下:
1 def print_status_record(srp, faulty_item): 2 global fmadm_msghdl 3 uurp = srp.uurec 4 str_time = time.ctime(uurp[0].sec) 5 faulty_item.time = str_time #"TIME" 6 faulty_item.event_id = uurp[0].uuid #"EVENT-ID" 7 faulty_item.msg_id = srp.msgid #"MSG-ID" 8 faulty_item.severity = srp.severity #"SEVERITY" 9 10 faulty_item.host = srp.host.server #"Host" 11 if srp.host.domain : 12 faulty_item.domain = srp.host.domain #"Domain" 13 else: 14 faulty_item.domain = "None" 15 16 faulty_item.platform = srp.host.platform #"Platform" 17 str_class_id = srp.host.chassis if srp.host.chassis else "None" 18 str_product_sn = srp.host.product_sn if srp.host.product_sn else "None" 19 20 faulty_item.class_id = str_class_id #"Chassis_id" 21 faulty_item.product_sn = str_product_sn #"Product_sn" 22 23 if srp.classt : #"Fault class" 24 str_faulty_class = get_name_list(srp.classt, \ 25 "Fault class :", srp.classt[0].pct, None) 26 faulty_item.faulty_class = str_faulty_class 27 else: 28 faulty_item.faulty_class = "None" 29 30 if srp.asru : #"Affects" 31 status = asru_same_status(srp.asru) 32 if status != -1 : 33 msg_name_list = get_name_list(srp.asru,"Affects :", 0, None) 34 msg_asru_status = print_asru_status(status, " ") 35 str_affects = msg_name_list + msg_asru_status 36 else: 37 str_affects = get_name_list(srp.asru,"Affects :", 0, \ 38 print_asru_status) 39 faulty_item.affects = str_affects 40 else: 41 faulty_item.affects = "None" 42 43 if not srp.fru or not srp.asru : #"Problem in" 44 if srp.resource : 45 status = asru_same_status(srp.resource) 46 if status != -1 : 47 msg_name_list = get_name_list(srp.resource, \ 48 "Problem in :", 0, None) 49 msg_rsrc_status = print_rsrc_status(status, " ") 50 str_problem_in = msg_name_list + msg_rsrc_status 51 else: 52 str_problem_in = get_name_list(srp.resource, \ 53 "Problem in :", 0, print_rsrc_status) 54 faulty_item.problem_in = str_problem_in 55 else: 56 faulty_item.problem_in = "None" 57 58 if srp.fru : #"FRU" 59 status = asru_same_status(srp.fru) 60 if status != -1 : 61 msg_name_list = get_name_list(srp.fru, "FRU :", \ 62 100 if srp.fru[0].pct == 100 else \ 63 srp.fru[0].max_pct, None) 64 msg_fru_status = print_fru_status(status, " ") 65 str_fru = msg_name_list + msg_fru_status 66 else: 67 str_fru = get_name_list(srp.fru, "FRU :", 100 \ 68 if srp.fru[0].pct == 100 else srp.fru[0].max_pct, \ 69 print_fru_status) 70 faulty_item.fru = str_fru 71 else: 72 faulty_item.fru = "None" 73 74 if srp.serial and not serial_in_fru(srp.fru, srp.serial) and \ 75 not serial_in_fru(srp.asru, srp.serial) : 76 str_serial_id = get_name_list(srp.serial, "Serial ID. :", 0, None) 77 faulty_item.serial_id = str_serial_id 78 else: 79 faulty_item.serial_id = "None" #"Serial ID" 80 81 nvl = srp.uurec[0].event 82 _fmd_msg_getitem_nv = libfmd_msg.fmd_msg_getitem_nv 83 _fmd_msg_getitem_nv.restype = c_char_p 84 85 description = _fmd_msg_getitem_nv(fmadm_msghdl, None, nvl, \ 86 FMD_MSG_ITEM_DESC) 87 faulty_item.description = description.decode('UTF-8') #"Description" 88 89 response = _fmd_msg_getitem_nv(fmadm_msghdl, None, nvl, \ 90 FMD_MSG_ITEM_RESPONSE) 91 faulty_item.response = response.decode('UTF-8') #"Response" 92 93 impact = _fmd_msg_getitem_nv(fmadm_msghdl, None, nvl, \ 94 FMD_MSG_ITEM_IMPACT) 95 faulty_item.impact = impact.decode('UTF-8') #"Impact" 96 97 action = _fmd_msg_getitem_nv(fmadm_msghdl, None, nvl, \ 98 FMD_MSG_ITEM_ACTION) 99 faulty_item.action = action.decode('UTF-8') #"Action" 100 101 return faulty_item
解析:
当if not srp.fru or not srp.asru成立,并且if srp.resource不成立时,这是便直接执行:faulty_item.problem_in = str_problem_in
因此就会出现以上错误信息,值得注意!
错误修改如下:
1 if not srp.fru or not srp.asru : #"Problem in" 2 if srp.resource : 3 status = asru_same_status(srp.resource) 4 if status != -1 : 5 msg_name_list = get_name_list(srp.resource, \ 6 "Problem in :", 0, None) 7 msg_rsrc_status = print_rsrc_status(status, " ") 8 str_problem_in = msg_name_list + msg_rsrc_status 9 else: 10 str_problem_in = get_name_list(srp.resource, \ 11 "Problem in :", 0, print_rsrc_status) 12 faulty_item.problem_in = str_problem_in 13 else: 14 faulty_item.problem_in = "None" 15 else: 16 faulty_item.problem_in = "None"