2015-01-04 13 views
5

1行のif文を使用して変数を無名関数に代入すると、 'else'ケースが期待どおりに動作しません。 「else」の後ろにリストされている無名関数を代入する代わりに、異なるの無名関数が割り当てられます。この関数は、の予期しないの匿名関数を返します。1行のif文を使用した匿名関数の割り当て

>> fn = lambda x: x if True else lambda x: x*x 
>> fn(2) 
2 
>> fn = lambda x: x if False else lambda x: x*x 
>> fn(2) 
<function <lambda> at 0x10086dc08> 
>> fn('foo')(2) 
4 

何が起こっているように見えることは、全体としてlambda x: x if False else lambda x: x*xが「他」の場合では無名関数として返されるということです。次のようにして目的の動作を達成することができました:

>> fn = (lambda x: x*x, lambda x: x)[True] 
>> fn(2) 
2 
>> fn = (lambda x: x*x, lambda x: x)[False] 
>> fn(2) 
4 

しかし、私はまだこの異常な動作の底を知りたいです。何かご意見は?

答えて

11

lambdaは、条件式より弱い結合を有する。実際、この言語では演算子の優先順位が最も低くなっています。だから、

enter image description here

、この行:documentation から

fn = lambda x: x if True else lambda x: x*x 

が実際としてPythonによって解釈されている:あなたが欲しいものを行うには

fn = lambda x: (x if True else lambda x: x*x) 

、あなたかっこを追加する必要があります:

fn = (lambda x: x) if True else (lambda x: x*x) 

テーブルが少なくともから最大に順序付けられていることに留意されたいです。

関連する問題