[解決済み] Python lambdaのローカル値へのバインディング
2023-05-19 12:25:21
質問
次のコードは
1
を2回出力していますが、私が期待するのは
0
と表示され、次に
1
.
def pv(v) :
print v
x = []
for v in range(2):
x.append(lambda : pv(v))
for xx in x:
xx()
私は、pythonのラムダが、舞台裏で、ローカル変数が指す参照にバインドすることを期待していました。しかし、それは事実ではないようです。私は、ラムダがモダンC++のバインド('boost::bind' など)に相当することを行っている大規模なシステムでこの問題に遭遇しました。
では、ローカル変数をラムダ関数にバインドして、使用時に正しい参照を保持させるにはどうしたらよいのでしょうか。ガベージコレクタを持つ言語からこれを期待しないので、私はこの動作にかなり驚かされました。
どのように解決するのですか?
変更
x.append(lambda : pv(v))
を
x.append(lambda v=v: pv(v))
.
Pythonのラムダは、ローカル変数が指している参照に裏でバインドしていると思うかもしれませんが、それはPythonの仕組みではありません。 Pythonは関数が呼び出されたときに変数名を調べますが、関数が作られたときには調べません。 デフォルトの引数は、関数が呼び出されたときではなく、関数が作成されたときに評価されるため、デフォルトの引数を使用すると動作します。
これはラムダについて特別なことではありません。 考えてみてください。
x = "before foo defined"
def foo():
print x
x = "after foo was defined"
foo()
プリント
after foo was defined
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] 環境変数の値にアクセスする方法
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
最新
-
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でファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] Python Logging でログメッセージが2回表示される件
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Pythonでファイルの読み込みと上書きをする