題目:利用閉包返回一個(gè)計(jì)數(shù)器函數(shù)造虎,每次調(diào)用它返回遞增整數(shù)
我一開始是這么寫的
def createCounter():
i = 0
def counter():
i+=1
return i
return counter
但是發(fā)生了報(bào)錯(cuò)
Traceback (most recent call last):
File "main.py", line 12, in <module>
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
File "main.py", line 6, in counter
i+=1
UnboundLocalError: local variable 'i' referenced before assignment
包括整數(shù)1也是對(duì)象,而且最重要的是Python中整形是不可變的抹缕,i和i+1指向的是兩塊不同的地址寓娩。在內(nèi)函數(shù)中執(zhí)行 i = i + 1 時(shí),機(jī)器并不知道你是想創(chuàng)建一個(gè)局部變量i 呢還是想做賦值操作
而此處又不能使用global
去聲明為全局變量达址,后來(lái)發(fā)現(xiàn)可以使用nonlocal
去聲明非本地非全局變量
可以參考這篇文章Python學(xué)習(xí):關(guān)鍵字global和nonlocal的用法說(shuō)明,感謝這位老哥的文章
其實(shí)除了使用nonlocal
去聲明解決以外 還可以使用list
去解決趁耗,因?yàn)槭褂?code>list的時(shí)候是對(duì)這個(gè)可變數(shù)據(jù)類型進(jìn)行修改并沒(méi)有聲明新的變量