意外的python函数返回行为

kgu*_*lly 2 python function

我的工作,通常1个返回值的函数,但有时出于类似的原因,以返回2 这个帖子,并注意到了这个例子最好地说明了一些意外的行为:

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
Run Code Online (Sandbox Code Playgroud)

我希望这两个函数的行为方式相同.testfcn2按预期工作:

testfcn2(False)
10

testfcn2(True)
(10, 20)
Run Code Online (Sandbox Code Playgroud)

但是,testfcn1总是返回两个值,如果return_two为False,则只返回第一个值两次:

testfcn1(False)
(10, 10)

testfcn1(True)
(10, 20)
Run Code Online (Sandbox Code Playgroud)

这种行为有理由吗?

Ana*_*mar 5

在您testfcn1的表达式中,表达式分为 -

(a, (a*2 if return_two else a))           #This would always return a tuple of 2 values.
Run Code Online (Sandbox Code Playgroud)

而不是(你认为它会是什么) -

(a, a*2) if return_two else a             #This can return a tuple if return_two is True otherwise a single value `a` .
Run Code Online (Sandbox Code Playgroud)

如果你想要第二组表达式,你必须使用我上面使用过的括号.


显示差异的示例 -

>>> 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)
Run Code Online (Sandbox Code Playgroud)