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

2024-03-29 14:56:52 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的问题的一个简化例子。我认为这些函数会有完全相同的行为:

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

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


Tags: lambdakey函数trueifdeftypesort
1条回答
网友
1楼 · 发布于 2024-03-29 14:56:52

lambda具有lowest 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的子类)。你知道吗

相关问题 更多 >