2016-07-28 109 views
1

Python 3中追加函數對象列表時可能會丟失訂單嗎?Python列表的奇怪行爲

我的理解是,Python列表是有序的,確實運行

numbers = [] 

for i in range(10): 

    numbers.append(i) 

print(numbers) 

回報[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]預期。

如果我追加功能在此MWE對象然而,如:

functions = [] 

for k in range(10): 

    def test(): 
     print('This is the %i th function.' %k) 

    functions.append(test) 

,並呼籲functions[2]()我得到This is the 9 th function.

有人可以使這種古怪的行爲有意義嗎?

+1

[後期綁定關閉](http://docs.python-guide.org/en/latest/writing/gotchas/#late-binding-closures) –

回答

2

功能閉包在定義變量時不捕獲變量的值,它捕獲變量的名稱。

因此,您存儲在functions[2]中的函數引用k。當你打電話給它的時候,它會告訴你k被調用時的值,而不是當它被定義時。

+1

是......而解決方法是使用'def test (k = k)'來適當地綁定它... –