UnboundLocalError: local variable referenced before assignment

val = 9
def test(flag):  
    if flag:  
        val = 1  
    else:  
        print("test")  
    return val 

if __name__ == '__main__':
    ret = test(0)
    print(ret)

显示UnboundLocalError: local variable 'val' referenced before assignment
但是代码改成下面这样

val = 9
def test():   
    return val 

if __name__ == '__main__':
    ret = test()
    print(ret)

就不报错,但是这2者都是return val,没有区别呀,为什么?

我是参考这个地方实践的 https://www.cnblogs.com/fendo...

阅读 4.8k
2 个回答

val = 1 定义了一个新的变量,于是在函数中对 val 的引用就不是全局的 val 了,而是函数里那个 val 。但是,在 return 的时候并没有对它赋值,于是就出错了。

可以在函数里加一行 global val ,这样所有对 val 的引用(包括 val = 1)就都是全局的了。

python 3.3.7 文档 4.1. Naming and binding

函数内出现变量赋值if flag:val = 1,不管有没有执行到,编译器默认把变量声明为local变量,所以

if flag:  
    val = 1  #local var
return val  #local var
--------------
return val  #global var 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题