一連のGUIイベントでほぼ同じコールバック関数が必要です。この関数は、呼び出されたイベントによって多少異なる動作をします。私には単純なケースのようですが、ラムダ関数のこの奇妙な振る舞いを理解することはできません。ラムダ関数の範囲とそのパラメータは?
だから私は下に次の単純化されたコードを持っている:
def callback(msg):
print msg
#creating a list of function handles with an iterator
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(m))
for f in funcList:
f()
#create one at a time
funcList=[]
funcList.append(lambda: callback('do'))
funcList.append(lambda: callback('re'))
funcList.append(lambda: callback('mi'))
for f in funcList:
f()
このコードの出力は次のとおりです。
mi
mi
mi
do
re
mi
私は予想:
めちゃめちゃイテレータを使用しているのはなぜdo
re
mi
do
re
mi
物事?
私はdeepcopyを使用して試した:
import copy
funcList=[]
for m in ('do', 're', 'mi'):
funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
f()
しかし、これは同じ問題を抱えています。
あなたの質問のタイトルはやや誤解を招きます。 – lispmachine
lambdaを混乱させるのはなぜですか?関数を定義するのにdefを使わないのはなぜですか?ラムダをとても重要にするあなたの問題についてはどうですか? –
@ S.Lottネストされた関数は同じ問題を引き起こします(もっと明瞭に見えるかもしれません)。 – lispmachine