ホームページ バックエンド開発 Python チュートリアル Python ループ内の関数がすべて同じ値を返すのはなぜですか?

Python ループ内の関数がすべて同じ値を返すのはなぜですか?

Dec 20, 2024 pm 04:22 PM

Why Do My Functions in a Python Loop All Return the Same Value?

ループまたは内包表記で関数を作成する場合の遅延バインディングについて

ループ内で関数を作成しようとすると、次のような状況が発生する可能性があります。すべての関数は、異なる出力を期待しているにもかかわらず、同じ値を返します。この動作は、変数の値が実行時に解決される遅延バインディングが原因で発生します。

Python の遅延バインディング

Python では、関数とラムダは実行時のデフォルトのバインド変数。これは、関数が呼び出されたときに、その中で使用されている変数が検索されることを意味します。ループでは、ループ反復子 i は後で解決され、その時点までにループ後の i の最終値を参照します。

たとえば、次のコード スニペットでは:

functions = []

for i in range(3):
    def f():
       return i

    functions.append(f)
ログイン後にコピー

関数リスト内のすべての関数は、同じ i の値を参照します。これは、ループ終了後の 2 です。

早期の強制バインディング

この問題を解決するには、早期バインディングを強制する必要があります。これにより、関数定義時に i の値が確実にバインドされます。これを行う 1 つの方法は、以下に示すように、引数のデフォルト値を使用することです。

functions = []

for i in range(3):
    
    def f(i=i):
       return i
    
    functions.append(f)
ログイン後にコピー

i 引数にデフォルト値を指定すると、早期バインディングが強制されます。 f 関数に渡される i の値は、関数の実行時ではなく、関数の定義時に解決されます。

関数ファクトリの使用

別のアプローチは次のとおりです。必要なバインディングを持つ関数を作成する関数ファクトリを使用します。これには、バインドする変数を受け取り、事前にバインドされた変数を含むネストされた関数を返す追加関数の作成が含まれます。

def make_f(i):

    def f():
        return i
        
    return f
ログイン後にコピー

ループ内で、 f = make_f(i) を使用して適切な初期バインディングを使用して関数を実行します。

以上がPython ループ内の関数がすべて同じ値を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Pythonを使用してテキストファイルのZIPF配布を見つける方法 Pythonを使用してテキストファイルのZIPF配布を見つける方法 Mar 05, 2025 am 09:58 AM

Pythonを使用してテキストファイルのZIPF配布を見つける方法

Pythonでファイルをダウンロードする方法 Pythonでファイルをダウンロードする方法 Mar 01, 2025 am 10:03 AM

Pythonでファイルをダウンロードする方法

Pythonでの画像フィルタリング Pythonでの画像フィルタリング Mar 03, 2025 am 09:44 AM

Pythonでの画像フィルタリング

HTMLを解析するために美しいスープを使用するにはどうすればよいですか? HTMLを解析するために美しいスープを使用するにはどうすればよいですか? Mar 10, 2025 pm 06:54 PM

HTMLを解析するために美しいスープを使用するにはどうすればよいですか?

Pythonを使用してPDFドキュメントの操作方法 Pythonを使用してPDFドキュメントの操作方法 Mar 02, 2025 am 09:54 AM

Pythonを使用してPDFドキュメントの操作方法

DjangoアプリケーションでRedisを使用してキャッシュする方法 DjangoアプリケーションでRedisを使用してキャッシュする方法 Mar 02, 2025 am 10:10 AM

DjangoアプリケーションでRedisを使用してキャッシュする方法

Natural Language Toolkit(NLTK)の紹介 Natural Language Toolkit(NLTK)の紹介 Mar 01, 2025 am 10:05 AM

Natural Language Toolkit(NLTK)の紹介

TensorflowまたはPytorchで深い学習を実行する方法は? TensorflowまたはPytorchで深い学習を実行する方法は? Mar 10, 2025 pm 06:52 PM

TensorflowまたはPytorchで深い学習を実行する方法は?

See all articles