一、報錯含義:
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
