python 複数行 - ラムダ関数を使った辞書の理解が間違った結果をもたらす





引数なし ラムダ式 (3)


Pythonスコープはレキシカルです。 クロージャは、変数の実際のオブジェクト/値ではなく、変数の名前とスコープを参照します。

何が起こるかは、各ラムダがxの値ではなく変数xキャプチャしているということです。

ループの終わりで変数xは9に結合されているので、 すべてのラムダは値が9のこのxを参照します。

なぜ@ ChrisPの答えが働くのですか?

make_funcは、(関数に渡される) xの値を強制的に評価します。 したがって、ラムダは現在x値で作られており、上記のスコープの問題は避けています。

def make_func(x):
    return lambda y: x

f = {x: make_func(x) for x in range(10)}

私はPython 3.5.1で以下のコードを試しました:

>>> f = {x: (lambda y: x) for x in range(10)}
>>> f[5](3)
9

これは5を返すはずです。 私は他の価値がどこから来ているのか分からず、何も見つけることができませんでした。

それは参照に関連するもののようです - それは常に割り当てられた最後の関数であるf[9]答えを返します。

ここでのエラーは何ですか?これが正しく動作するようにこれをどのように行う必要がありますか?




次の作業が必要です:

def make_func(x):
    return lambda y: x

f = {x: make_func(x) for x in range(10)}

あなたのコードのxは最後のx値を参照して終わります。これは9ですが、私の場合は関数スコープのxを参照しています。




dictの理解を使用した辞書作成の別の例を次に示します。

私がここでやりたいことは、各ペアがアルファベット辞書を作成することです。 英語の文字とそれに対応する英語のアルファベットの位置

>>> import string
>>> dict1 = {value: (int(key) + 1) for key, value in 
enumerate(list(string.ascii_lowercase))}
>>> dict1
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 
'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 
19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}
>>> 

リスト内のアルファベットとそのインデックスのリストを取得し、アルファベットとインデックスをスワップして辞書のキー値のペアを生成するためにここで列挙することに注目してください

コードをコンパクトにするために、それをより頻繁に使用することをお勧めします。







python dictionary lambda