使用单行 if 语句的匿名函数赋值

anonymous function assignment using a one line if statement

当使用单行 if 语句将变量分配给匿名函数时,'else' 情况不会按预期运行。没有分配 'else' 之后列出的匿名函数,而是分配了一个 不同的 匿名函数。此函数returns 预期 匿名函数。

>> 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 作为一个整体在 'else' 案例中作为匿名函数返回。我能够通过使用以下内容实现所需的行为:

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

不过,我还是想弄清这个异常行为的真相。有什么想法吗?

lambda 的绑定比条件表达式弱。事实上,它在该语言中具有最少的运算符优先级。来自documentation1:

所以,这一行:

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)

1注意table是从小到大排序的。