一個有趣的閉包題

以前的一個同事起一個閉包相關的一道題,大家看看這個輸出的結果應該是什麼?

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就一目瞭然了
一個有趣的閉包題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章