奇怪的行为:函数的三元运算符

时间:2015-02-07 05:11:40

标签: python function ternary-operator

以下是我的问题的简化示例。我认为这些函数具有完全相同的行为:

def f1(l):
    if type(l[0][0])==list: f=lambda x:x[0][0]
    else: f=lambda x:x[0]
    l.sort(key=f,reverse=True)

def f2(l):
    f=lambda x:x[0][0] if type(l[0][0])==list else lambda x:x[0]
    l.sort(key=f,reverse=True)

l=[[1,2],[3,4]]

但实际上f1(l)f2(l)因异常崩溃时正常工作:

IndexError: list index out of range

所以问题是为什么会这样,是否可以使用三元运算符来返回其中一个函数?

1 个答案:

答案 0 :(得分:8)

lambdalowest precedence among operators。这就是Python将该行解析为

的原因
f = lambda x: (x[0][0] if type(l[0][0]) == list else lambda x: x[0])

修复方法是将单个lambda括在括号中:

f = (lambda x: x[0][0]) if type(l[0][0]) == list else (lambda x: x[0])

尽管如此,type(l[0][0]) == list有点不对,isinstance(l[0][0], list)是最好的方式(它还处理list的子类。)