2016-07-28 12 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テストを使うことです(k = k) 'それを適切にバインドする –