zoukankan      html  css  js  c++  java
  • Python UnboundLocalError: local variable 'xxx' referenced before assignment 解决方法

    一、报错含义:

    val=9
    def test():
        print(val)
        val = 6
        print(val)
    test()

    翻译:本地变量xxx引用前没有定义。

     

    二、报错原因

    这是Python变量作用域的问题的问题导致的:

    1. 内部函数,不修改全局变量可以访问全局变量
    2. 内部函数,修改同名全局变量,则python会认为它是一个局部变量
    3. 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError
    val=9  #val现在是全局变量
    def test():
        print(val) #引用局部变量,但局部变量未在函数内定义,报局部变量未定义的error
        val = 6  #函数内,修改了同名全局变量,则变量val会被认为是局部变量,所以在上一句“print(val)”引用该变量时,被认为是局部变量的val,又没有在引用前定义,所以Unbound-LocalError
        print(val)
    test()

     

    三、解决方法

    如果想在函数里修改同名全局变量的值之前引用该变量,就需要在函数内引用前用global关键字将被认为是局部的变量定义为全局变量。如下:

    val=9
    def test():
        global val #将局部变量再次定义为全局变量
        print(val) #可以直接引用全局变量
        val = 6  #修改了同名全局变量,变量val会被认为是局部变量,但是在“print(val)”引用该变量之前,将变量又再次定义为全局变量,所以可能正确被引用,且修改的是全局同一个变量
        print(val)
    test() 
    print(val) #全局变量已在函数内被修改

    打印结果:

    9
    6
    6

    如果只是想在函数内使用同名变量,而不改变函数外全局变量的值,则直接在函数内引用该变量前,初始化即可。如下:

    val=9
    def test():
        val = 0 #定义局部变量val
        print(val) #引用局部变量
        val = 6  #修改局部变量,不会影响到全局变量的值
        print(val) #引用局部变量
    test() 
    print(val) #引用全局变量,不受函数内的局部变量影响

    打印结果:

    0
    6
    9

     

  • 相关阅读:
    类的加载顺序
    自定义形状类
    java的参数传递
    复数相加+equels、hashcode、clone<二>
    复数相加+equels、hashcode、clone<一>
    命令行程序
    计算阶乘
    控制程序的流程
    java运算符
    强制类型转换细节解析
  • 原文地址:https://www.cnblogs.com/l199616j/p/13904202.html
Copyright © 2011-2022 走看看