私はラムダをPythonで学んでいます。私は関数f = [f1, f2...]
のリストを作成して、各関数fi(x)
がリストx
をとり、(x[i]-1)
を返すようにする必要があります。この単純なラムダ関数がなぜ奇妙な出力を与えるのですか?
これはコーディングを試みた方法ですが、私は驚くべき結果を得ています。なぜ3枚のプリントがそれぞれ異なる結果をもたらすのか理解してください。最後の2つは私を完全に困惑させてしまった!
f = [(lambda x: x[i]-1) for i in range(5)]
# I expect f to be [ (lambda x: x[0]-1), (lambda x: x[1]-1), ...]
x = [1, 2, 3, 4, 5]
print f[0](x), f[1](x), f[2](x) # output: 4 4 4 !!
print [f[i](x) for i in range(5)] # output: [0, 1, 2, 3, 4] as expected
print [f[k](x) for k in range(5)] # output: [4, 4, 4, 4, 4] wha?!!!
編集:この質問はsuggested duplicateとはかなり異なります。リンクされた質問では、ユーザーが関数呼び出しの代わりに関数のリストを作成したという単純なエラーがありました。しかし、Tomasz Gandorの回答では、ここでいくつかの例を使って尋ねたのと同じ問題が議論されています。
https://stackoverflow.com/questions/6076270/python-lambda-function-in-list-comprehensions – 101
ちょっと好奇心から、なぜあなたは何かをコーディングしています..奇妙な?純粋な学問的関心?結局、Guidoはそれらを実装したことに後悔します:http://legacy.python.org/doc/essays/ppt/regrets/PythonRegrets。pdf – Arne
でもPython 3では 'i'でも動作しません。 – Szabolcs