人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

一、报错含义:

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

 

 

posted on 2020-11-06 21:44  测试开发喵  阅读(10604)  评论(0编辑  收藏  举报