2015-01-04 3 views
5

При назначении переменной анонимной функции с использованием оператора одной строки if случай «else» не ведет себя так, как ожидалось. Вместо назначения анонимной функции, указанной после «else», назначается анонимная функция. Эта функция возвращает ожидаемую анонимную функцию.назначение анонимной функции с использованием одной строки, если оператор

>> 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 имеет более слабое связывание, чем условное выражение. Фактически, он имеет наименьший приоритет оператора в языке. Из documentation :

enter image description here

Таким образом, эта линия:

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) 

Обратите внимание, что таблица упорядочена от наименьшего к наибольшему.

Смежные вопросы