一、报错含义:
val=9
def test():
    print(val)
    val = 6
    print(val)
test()

翻译:本地变量xxx引用前没有定义。
二、报错原因
这是Python变量作用域的问题的问题导致的:
- 内部函数,不修改全局变量可以访问全局变量
- 内部函数,修改同名全局变量,则python会认为它是一个局部变量
- 在内部函数修改同名全局变量之前调用变量名称(如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
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号