def f():
a = 1
def f1():
a = a + 1
return a
return f1
執(zhí)行是會報錯: UnboundLocalError
改一下:
def f():
a = 1
def f1():
b = a + 1
return b
return f1
可以正確運行結(jié)果為: 2
原因分析如下:
a = a + 1 這是個賦值表達式魄藕,在python中變量是不需要提取聲明的霉涨,一個變量第一次賦值就是聲明了這個變量刁赦。a = a + 1 這個表達式的意思是聲明一個局部變量a并將它 + 1后賦值給它自己殷费,而此時a 還沒有初始化(沒有被賦值)壶栋,所以會出現(xiàn)報錯 UnboundLocalError: local variable 'a' referenced before assignment
雖然閉包中內(nèi)部函數(shù)可以引用外部函數(shù)的變量假抄,但a = a + 1 中“=”號前的a覆蓋掉了外部函數(shù)f中的局部變量a=1,所以a = a + 1就會出現(xiàn)未定義的錯誤朵栖。只要外部函數(shù)f中的局部變量a 不被覆蓋就可以解決問題近上。所以改成b = a + 1就可以正常運行剔宪。其實還可以這樣改:
def f():
a = [1]
def f1():
a[0] = a[0] + 1
return a[0]
return f1
這也是可以正常運行的,因為此時的外部函數(shù)f的局部變量a 是一個可變對象