使用单行 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是从小到大排序的。
当使用单行 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是从小到大排序的。