クロージャの遅延束縛
次のコードを実行したときの出力として、正しいものを1つ選べ。
fs = [lambda: i for i in range(3)]
print([f() for f in fs])
- A
[0, 1, 2] - B
[0, 0, 0] - C
[3, 3, 3] - D
[2, 2, 2]
正解と解説を見る
正解:D
クロージャは変数そのものを参照するので、ループ変数を使うと遅延束縛になる。デフォルト引数 lambda i=i: i で値を固定できる。
| 順 | 実行する行 | 実行後の変数 |
|---|---|---|
| 1 | `fs = [lambda: i for i in range(3)]` | fs = [<function <lambda> at 0x…>, <function … |
| 2 | `print([f() for f in fs])` | fs = [<function <lambda> at 0x…>, <function … |
| 結果 | 実際の出力 | [2, 2, 2] |
- A
誤り。呼び出し時の
iの値が使われる。 - B
誤り。ループ後の
iは 2。 - C
誤り。
range(3)の最後の値は 2。 - D
正しい。lambda は変数
iを参照し、呼び出した時点の値(最後は 2)を使う。
このサイトの問題は、各試験の公式に示された出題範囲に沿って作ったオリジナルの模擬問題です。本試験の問題ではありません。一般社団法人Pythonエンジニア育成推進協会の公式サービスではありません。