奇怪的行为:函数的三元运算符
Strange behavior: ternary operator for functions
这是我的问题的一个简化示例。我认为这些函数会有完全相同的行为:
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
所以问题是为什么会这样,是否可以使用 returns 函数之一的三元运算符?
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
的子类)。
这是我的问题的一个简化示例。我认为这些函数会有完全相同的行为:
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
所以问题是为什么会这样,是否可以使用 returns 函数之一的三元运算符?
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
的子类)。