我正在处理一个通常返回1个值的函数,但有时会因类似的原因返回2 this post,并注意到这个例子最好地说明了一些意想不到的行为:
def testfcn1(return_two=False):
a = 10
return a, a*2 if return_two else a
def testfcn2(return_two=False):
a = 10
if return_two:
return a, a*2
return a
我希望这两个函数的行为方式相同。 testfcn2按预期工作:
testfcn2(False)
10
testfcn2(True)
(10, 20)
但是,testfcn1总是返回两个值,如果return_two为False,则只返回第一个值两次:
testfcn1(False)
(10, 10)
testfcn1(True)
(10, 20)
这种行为有没有理由?
答案 0 :(得分:5)
在testfcn1
中,表达式分组为 -
(a, (a*2 if return_two else a)) #This would always return a tuple of 2 values.
而不是(你认为会是什么) -
(a, a*2) if return_two else a #This can return a tuple if return_two is True otherwise a single value `a` .
如果你想要第二组表达式,你必须使用我上面使用的括号。
显示差异的示例 -
>>> 10, 20 if True else 10
(10, 20)
>>> 10, 20 if False else 10
(10, 10)
>>>
>>>
>>> (10, 20) if False else 10
10
>>> (10, 20) if True else 10
(10, 20)
>>>
>>>
>>> 10, (20 if False else 10)
(10, 10)
>>> 10, (20 if True else 10)
(10, 20)
答案 1 :(得分:3)
这是一个简单的运算符优先级问题。 return a, a*2 if return_two else a
如果被解释为return a, (a*2 if return_two else a)
。您应该使用括号来更改优先级。
def testfcn1(return_two=False):
a = 10
return (a, a*2) if return_two else a