from: http://blog.chinaunix.net/u2/82912/showart_2191787.html
and http://zhouzaibao.javaeye.com/blog/559381
http://www.cnblogs.com/ms_config/articles/1685018.html
如果内部函数有引用外部函数的同名变量,并且对这个变量有修改.那么python会认为它是一个局部变量.
解决方法:引用的时候,再次:
global all_length
"local variable referenced before assignment"的几种列子
1)这种情况是自己碰到的,我把代码精简了一下,举个列子
> > > def max( a) : . . . if a > 0: . . . b = 1. . . print b. . . > > > max( 1) 1> > > max( 0) Traceback ( most recent call last) : File "<stdin>" , line 1, in < module> File "<stdin>" , line 4, in max UnboundLocalError: local variable 'b' referenced before assignment
上面的代码中,当a大于0的时候,不会出现问题,但当a不大于0的时候,就报错了。
这种错误当代码少的时候容易发现,比较难办的就是,当你的代码很多,然后中间隔了很多行以后,再去调用b这个变量的时候,很难去发现这个问题。
解决办法:
1.把if-else写全,这样每种情况都会对b进行定义
2.在if之前给b一个默认值。这样的好处就是代码量小。
2)这种情况是局部变量和全局变量访问的问题。
首先看一个列子
#! / usr/ bin/ python #global varibale USER_COUNT = 0 #functiondef main( ) : adduser( ) def adduser( ) : print 'There are' , USER_COUNT, 'users so far' # actually run main( ) main( )
这段程序可以正常工作,函数adduser调用全局变量USER_COUNT
再看这一段,注意函数adduser()
#! / usr/bin/python #global varibale USER_COUNT = 0 #function def main( ) : adduser( ) def adduser( ) : USER_COUNT = USER_COUNT + 1 print 'There are' , USER_COUNT, 'users so far'
main( )
这段程序的结果是”UnboundLocalError: local variable 'USER_COUNT' referenced before assignment“
想明白这点,就要知道python对变量访问的规则
当搜索一个变量的时候,python先从局部作用域开始搜索,如果在局部作用域没有找到那个变量,那样python就在全局变量中找这个变量,如果找不到抛出异常(NAMEERROR 或者 Unbound-
LocalError,这取决于你使用的python 版本。)
知道了对变量的访问规则,那就开始我们的解决办法
1.在函数adduser中加”global USER_COUNT“,就可以对全局变量进行操作。
def adduser( ) : global USER_COUNT USER_COUNT = USER_COUNT + 1 print 'There are' , USER_COUNT, 'users so far'
2.在函数adduser中对变量”USER_COUNT“进行定义(这种情况,相当于使用一个新的变量,但是一个局部变量和一个全局变量同名是一件很不好的事情)
def adduser( ) : USER_COUNT = 0 USER_COUNT = USER_COUNT + 1 print 'There are' , USER_COUNT, 'users so far'
3)先把例子留到这里吧,因为自己还不是太明白这个,希望高手帮忙
def bankAccount( ) : bal= 0 def credit( amount) : bal= bal+ amount def debit( amount) : bal= bal- amount def balance( ) : return bal return ( lambda x: { "credit" : credit, "debit" : debit, "balance" : balance } [ x] ) b= bankAccount( ) print b( "balance" ) ( ) b( "credit" ) ( 100)