1. ホーム
  2. function

[解決済み] クロージャ」と「ラムダ」の違いは何ですか?

2022-03-23 16:04:53

質問

どなたか説明してください。私はそれらの背後にある基本的な概念を理解していますが、私はしばしばそれらが互換的に使用されているのを見て、私は混乱します。

せっかくだから、普通の関数とどう違うの?

どのように解決するのか?

A ラムダ は単なる無名関数で、名前を付けずに定義された関数のことです。Schemeのようないくつかの言語では、これは名前付き関数と同じである。実際、関数の定義は、内部でラムダを変数に束縛していると書き直される。Pythonのような他の言語では、両者の間に(どちらかといえば不要な)区別があるが、それ以外は同じようにふるまう。

A 閉鎖 は、以下のような任意の関数です。 を閉じる 環境 で定義されたものです。これは、パラメータリストにない変数にもアクセスできることを意味します。例を挙げます。

def func(): return h
def anotherfunc(h):
   return func()

これはエラーの原因となります。 func オーバークローズ の環境は anotherfunc - h は未定義です。 func はグローバル環境に対してのみクローズします。これは動作します。

def anotherfunc(h):
    def func(): return h
    return func()

だって、ここに。 func が定義されているのは anotherfunc で、python 2.3以上(またはこのような数字)で、それらが ほとんど はクロージャを正しく扱えるようになった(突然変異はまだうまくいっていない)ので、これはつまり 閉じる anotherfunc の環境にアクセスし、その中の変数にアクセスすることができます。 Python 3.1+では、突然変異は その nonlocal キーワード .

もう一つの重要なポイント func の上に閉じ続けます。 anotherfunc の環境で評価されなくなったときでも anotherfunc . このコードも動作します。

def anotherfunc(h):
    def func(): return h
    return func

print anotherfunc(10)()

これは10と表示されます。

これは、お気づきのように、何の関係もありません。 ラムダ この2つは(関連してはいるが)異なる概念である。