入れ子関数のローカル変数
この複雑な例には入れ子関数とクロージャーが含まれており、混乱を招く可能性があります。謎を解き明かしましょう。
入れ子関数の実行
入れ子関数は、実行されると、親スコープから変数にアクセスします。この場合、pet_function は get_petters ジェネレーター内のネストされた関数です。実行すると、get_petters のスコープ内の変数が検索されます。
クロージャ セルとローカル変数
pet_function には 1 つの自由変数 (ケージ) があります。コンパイル中、この自由変数はクロージャ セルによって表されます。 pet_function が実行されると、このクロージャ セルは get_petters の周囲のスコープ内のケージの値をチェックします。
動的ルックアップとクロージャ
funs リストが実行されると、問題のある動作が発生します。が作成されます。この時点で、get_petters のケージの値は「cat」になります。 funs の各関数が呼び出されると、pet_function のクロージャ セルは、定義時ではなく、その関数呼び出し時のケージの値を検索します。
さまざまな動物へのアクセス
この問題を解決するには、pet_function が動物ごとにケージ オブジェクトの特定のインスタンスにアクセスする必要があります。これは、部分関数、新しい関数のスコープ、またはキーワード パラメーターを通じて実現できます。
部分関数
部分関数は、固定パラメーターを持つ新しい関数を作成します。 functools.partial() を使用した例を次に示します。
def pet_function(cage=None): print("Mary pets the " + cage.animal + ".") yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
新しい関数スコープ
新しい関数スコープを作成すると、ケージ変数が新しく定義された関数内にバインドされるようになります。 function.
def scoped_cage(cage=None): def pet_function(): print("Mary pets the " + cage.animal + ".") return pet_function yield (animal, partial(gotimes, scoped_cage(cage)))
キーワードパラメータ
キーワード パラメータのデフォルト値としてケージ変数をバインドします:
def pet_function(cage=cage): print("Mary pets the " + cage.animal + ".") yield (animal, partial(gotimes, pet_function))
以上が入れ子関数は Python でローカル変数とクロージャをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。