Pythonで遊んでたら疑問点が・・・

リスト内包便利ですね。

[ x**2 for x in range(10) ]

と、配列の中に処理を書ける。
この式の場合、1から10までの数について、それぞれ2乗した数の配列を得ることができます。Perlでいうmap関数みたいなものですね。ほぼそのものか。

if文で条件をつけることもできますね。

[ x**2 for x in range(10) if x**2 % 4 == 0 ]

とすると、2乗が4で割り切れるものだけ含んだ配列を作成することができる。
結果をリストに格納して返してくれるわけだから、リストに格納できるものであれば、なんでもx**2の部分にかけるはず。
ちょっと意地悪して、lambda式を格納してみました。

>>>lams = [ lambda l,m : l * x + m for x in range(10) ]
>>>[ lam( 1, 5 ) for lam in lams ]
[14, 14, 14, 14, 14, 14, 14, 14, 14, 14]

おやー?予想と違う結果が返ってきた。
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
みたいな結果になると思ってたのに。lambdaの実装が関係してるのかな?リスト内包の展開が終わったあとに関数が作成される?

ためしにリスト内包を使わないで書いてみる。

>>>lams = [ lambda l,m : l * 0 + m , lambda l,m : l * 1 + m , lambda l,m : l * 2 + m ]
>>>[ lam( 1, 5 ) for lam in lams ]
[5, 6, 7]

おっと、ちゃんと返ってくるナァ。うーん、これはバグなの?それともオレがおかしいの?