検索
ホームページバックエンド開発Python チュートリアルループ内で定義された関数が同じ値を返すことが多いのはなぜですか?これを修正するにはどうすればよいですか?

Why Do Functions Defined in Loops Often Return the Same Value, and How Can This Be Fixed?

ループ内での関数の作成: 遅延バインディングの問題への対処

ループ内で個々の関数を定義しようとすると、一般的に次の問題が発生します。すべての関数は、一意の結果を表すことを目的としているにもかかわらず、同じ値を返します。遅延バインディングとして知られるこの現象は、関数が呼び出されるまで引数を受け取らないために発生します。

for ループを使用した次の例を考えてみましょう。

functions = []
for i in range(3):
    def f():
        return i
    functions.append(f)

書かれているように、各関数は呼び出されたときに、対応する i の値を検索します。ただし、ループの実行後、すべての関数は i (2) の最終値を参照し、次の出力が得られます:

print([f() for f in functions])
# Expected: [0, 1, 2]
# Actual: [2, 2, 2]

解決策: 早期バインディングの強制

この問題に対処するには、呼び出し時ではなく定義時に引数を関数に割り当てて、早期バインディングを強制する必要があります。これは、関数定義にデフォルトの引数を追加することで実現できます。

functions = []
for i in range(3):
    def f(i=i):
        return i
    functions.append(f)

デフォルトの引数 (この場合、i=i) は、関数の呼び出し時ではなく、関数の定義時に評価されます。これにより、各関数が一意の引数値を保持し、目的の出力が生成されるようになります。

print([f() for f in functions])
# Output: [0, 1, 2]

クロージャを使用した代替アプローチ

追加の引数の可能性について懸念が生じた場合関数に渡すために、クロージャを使用してより複雑なアプローチを実装できます。

def make_f(i):
    def f():
        return i
    return f

このシナリオでは、関数ファクトリー (make_f) が作成されます。ループ内では、make_f から返された関数は、def f(): を直接呼び出すのではなく、変数 f に割り当てられます。このアプローチでは、早期バインディング ソリューションと同様に、各関数がその排他的な引数値を保持することが保証されます。

以上がループ内で定義された関数が同じ値を返すことが多いのはなぜですか?これを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Pythonリストをどのようにスライスしますか?Pythonリストをどのようにスライスしますか?May 02, 2025 am 12:14 AM

slicingapythonlistisdoneusingtheyntaxlist [start:stop:step] .hore'showitworks:1)startisthe indexofthefirstelementtoinclude.2)spotisthe indexofthefirmenttoeexclude.3)staptistheincrementbetbetinelements

Numpyアレイで実行できる一般的な操作は何ですか?Numpyアレイで実行できる一般的な操作は何ですか?May 02, 2025 am 12:09 AM

numpyallows forvariousoperationsonarrays:1)basicarithmeticlikeaddition、減算、乗算、および分割; 2)AdvancedperationssuchasmatrixMultiplication;

Pythonを使用したデータ分析では、配列はどのように使用されていますか?Pythonを使用したデータ分析では、配列はどのように使用されていますか?May 02, 2025 am 12:09 AM

Arraysinpython、特にnumpyandpandas、aresentialfordataanalysis、offeringspeedandeficiency.1)numpyarraysenable numpyarraysenable handling forlaredatasents andcomplexoperationslikemoverages.2)Pandasextendsnumpy'scapabivitieswithdataframesfortruc

リストのメモリフットプリントは、Pythonの配列のメモリフットプリントとどのように比較されますか?リストのメモリフットプリントは、Pythonの配列のメモリフットプリントとどのように比較されますか?May 02, 2025 am 12:08 AM

listsandnumpyarraysinpythonhavedifferentmemoryfootprints:listsaremoreflexiblellessmemory-efficient、whileenumpyarraysaraysareoptimizedfornumericaldata.1)listsstorereferencesto objects、with whowedaround64byteson64-bitedatigu

実行可能なPythonスクリプトを展開するとき、環境固有の構成をどのように処理しますか?実行可能なPythonスクリプトを展開するとき、環境固有の構成をどのように処理しますか?May 02, 2025 am 12:07 AM

toensurepythonscriptsbehaveCorrectlyAcrossDevelosment、staging、and Production、usetheseStrategies:1)環境variablesforsimplestetings、2)configurationfilesforcomplexsetups、and3)dynamicloadingforadaptability.eachtododododododofersuniquebentandrequiresca

Pythonアレイをどのようにスライスしますか?Pythonアレイをどのようにスライスしますか?May 01, 2025 am 12:18 AM

Pythonリストスライスの基本的な構文はリストです[start:stop:step]。 1.STARTは最初の要素インデックス、2。ストップは除外された最初の要素インデックスであり、3.ステップは要素間のステップサイズを決定します。スライスは、データを抽出するためだけでなく、リストを変更および反転させるためにも使用されます。

どのような状況で、リストは配列よりもパフォーマンスが向上しますか?どのような状況で、リストは配列よりもパフォーマンスが向上しますか?May 01, 2025 am 12:06 AM

ListSoutPerformArraysIn:1)ダイナミシジョンアンドフレーケンティオン/削除、2)ストーリングヘテロゼンダタ、および3)メモリ効率の装飾、ButmayhaveslightPerformancostsinceNASOPERATIONS。

PythonアレイをPythonリストに変換するにはどうすればよいですか?PythonアレイをPythonリストに変換するにはどうすればよいですか?May 01, 2025 am 12:05 AM

toconvertapythonarraytoalist、usetheList()constructororageneratorexpression.1)importhearraymoduleandcreateanarray.2)useList(arr)または[xforxinarr] toconvertoalistは、largedatatessを変えることを伴うものです。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール