以前的一個同事起一個閉包相關的一道題,大家看看這個輸出的結果應該是什麼?
def a():
li = []
for i in range(1,4):
def b():
print('*'*30,i)
return i**2
li.append(b)
print('~~~~')
return li
a1,a2,a3 = a()
print(a1())
print(a2())
print(a3())
其實這個的輸出結果是
~~~~
~~~~
~~~~
****************************** 3
9
****************************** 3
9
****************************** 3
9
驚不驚喜,意不意外?
怎麼輸出的是三個9而不是我們想象中的1 4 9?
你是因爲我們傳入列表裏面的只是一個函數,而且是一個沒有被調用的函數,
所以i的值和函數無關,和我們調用函數時候的i值有關,
那都是因爲
li.append(b)
而不是
li.append(b())
後者是調用了b函數纔會和i值相關
而我們使用b只是把b函數存起來,等待被調用所以就和i值無關,
查看一下debug就一目瞭然了