[解決済み] ループ内での関数の作成
2022-07-03 17:02:12
質問
ループの中で関数を作成しようとしています。
functions = []
for i in range(3):
def f():
return i
# alternatively: f = lambda: i
functions.append(f)
問題は、すべての関数が結局同じになってしまうことです。0、1、2を返すのではなく、3つの関数がすべて2を返してしまうのです。
print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output: [2, 2, 2]
なぜこのようなことが起こるのか、また、3種類の関数がそれぞれ0、1、2を出力するようにするにはどうしたらよいのでしょうか。
どのように解決すればよいのでしょうか?
での問題に遭遇しています。
遅延バインディング
-- 各関数は
i
をできるだけ遅く探す(したがって、ループの終わりの後に呼ばれたとき。
i
に設定されます。
2
).
早期バインディングを強制することで簡単に修正できます。
def f():
を
def f(i=i):
のようにします。
def f(i=i):
return i
デフォルトの値(右側の
i
で
i=i
は引数名のデフォルト値
i
であり、これは左側の
i
で
i=i
で調べます)。
def
時間ではなく
call
時間ではないので、本質的には初期のバインディングを特別に探すための方法です。
もしあなたが
f
が余分な引数を取る(そして潜在的に間違って呼ばれる)ことを心配するなら、クロージャを "関数ファクトリ" として使うという、より洗練された方法があります。
def make_f(i):
def f():
return i
return f
で、ループの中で
f = make_f(i)
の代わりに
def
ステートメントの代わりに
関連
-
[解決済み】終了コード -1073741515 (0xC0000135)でプロセス終了)
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] 億の相対的輸入
-
[解決済み] Do-whileループをエミュレートする方法は?
-
[解決済み] なぜ[]はlist()よりも速いのですか?
-
[解決済み】ラムダ関数のクロージャは何を捕捉するのか?
-
[解決済み】Pythonのany関数とall関数はどのように機能するのですか?
-
[解決済み】R関数でオプション引数を指定する "正しい "方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonコンテナのための組み込み汎用関数操作
-
PythonはWordの読み書きの変更操作を実装している
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です