python的UnboundLocalError

在线上看到python的memcache客户端报错:

File "/data1/dist/app/trunk/duitang/memcache.py", line 929, in _recv_value
    return val
UnboundLocalError: local variable 'val' referenced before assignment

 

UnboundLocalError: local variable 'val' referenced before assignment

这个错误很感兴趣,google了一下。

 

产生这个错误的场景有:

def test(flag):
	if flag:
		val = 1
	else:
		print 'fuck'
	return val

test(0)

前面这段code还好理解,下面这段code也会报这个Error就让人觉得有点坑爹了:

>>> counter = 0
>>> def increment():
...     counter+=1
... 
>>> increment()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in increment
UnboundLocalError: local variable 'counter' referenced before assignment

 

错误原因在于python没有变量的声明 , 所以它通过一个简单的规则找出变量的范围 :如果有一个函数内部的变量赋值 ,该变量被认为是本地的。 因此行 

counter+=1

会隐式的把counter设为increment()的本地变量,当对counter做自增操作时,解释器才发现它并没有分配,这时就抛出UnboundLocalError 要解决这个问题可以通过global 关键字

 

参考:http://stackoverflow.com/questions/9264763/unboundlocalerror-in-python?rq=1

你可能感兴趣的:(python)