为什么aa()正常而cc()报错呢

为什么aa()正常而cc()报错呢

var = 'gv'

class aa :
    def __init__ (self):
        print var



class bb :
    def __init__ (self):
        var = 'in'
        print var
        
class cc :
    def __init__ (self):
        print var
        var = 'in'




aa(),bb(),cc()
当遇到一个变量时,Python是这样处理的:
先看看在同一个block(比如这里的__init__方法)里有没有变量的声明,如果有,就是local的变量;如果没有,就到上一级block里去找,这个例子里,最终找了了global的变量声明var = 'gv'

对于class aa,不报错是因为aa的__init__方法里找不到var的声明,而是在global的namespace里找的,所以print的结果是gv
对于class bb,同一个block里又声明了local的var,值为in,所以print的结果是in
对于class cc,同一个block里有声明local的var,所以不会去找global的var声明,但这个local的声明是在print的后面,所以报异常UnboundLocalError: local variable 'var' referenced before assignment


参考:
Python Reference Manual的4.1 Naming and binding一节

http://mail.python.org/pipermail/tutor/2005-October/042694.html