为什么在将lambda函数赋值给变量时需要括号?

时间:2016-12-20 09:33:11

标签: python lambda

我在下面的代码片段中偶然发现Python中的一些意外行为

b = False

func_1 = lambda x,y:set([x]) == y if b else lambda x,y: x in y
func_2 = None   

if not b:
    func_2 = lambda x,y : x in y
else:
    func_2 = lambda x,y:set([x]) == y 

print(func_1("Hello", set(["Hello", "World"])))
print(func_2("Hello", set(["Hello", "World"])))

输出

<function <lambda>.<locals>.<lambda> at 0x7f7e5eeed048>
True

然而,当在lambdas周围添加括号时,一切都按预期工作:

func_1 = (lambda x,y:set([x]) == y) if b else (lambda x,y: x in y)
# ...

然后输出

True
True

为什么我需要这些括号?我认为初始表达式等同于长if-else结构。

1 个答案:

答案 0 :(得分:5)

它只是标准的优先规则。您的第一个表达式被解析为:

lambda x,y:set([x]) == (y if b else lambda x,y: x in y)

因此,您需要添加括号以创建正确的优先级。