测试Truthy或Falsy参数通过函数传递到if语句

时间:2017-03-20 02:49:50

标签: python if-statement truthiness

我也在这一点上画了一个空白。如果有人能帮助我理解为什么我的代码没有打印预期的输出,我将不胜感激。

def bool_to_str(bval):
    if bval is True:
        mytest = 'Yes'
    else:
        mytest = 'No'
    return mytest

预期产出:

>>>bool_to_str([1, 2, 3])
'Yes'
>>>bool_to_str(abcdef)
'Yes'

实际输出了什么:

>>>bool_to_str([1, 2, 3])
'No'
>>>bool_to_str(abcdef)
'No'

请帮助我理解我做错了什么。我认为这个功能需要测试论证的实际真值,但我不明白我错过了什么。

3 个答案:

答案 0 :(得分:8)

bval is True检查[1, 2, 3]是否确实是 True 对象。您需要bool()之类的内容来评估对象是否为真值但与 True 对象不同。

答案 1 :(得分:2)

is检查引用相等性,而非真实性。现在很明显[1,2,3](这是一个list对象)没有指向True对象(这是bool个对象)。很难说这里未定义的abcdef是否指向True。但既然你没有提供它,我会认为它指向不同的东西。

只有bool_to_str(True)bool_to_str(<expr>) <expr> 评估为bool True才会'Yes'bool是单例,因此所有True都是同一个对象。)

重点是,为了检查<expr>的真实性,只需写下if <expr>: 即可。所以在你的情况下它应该是:

if bval:

您也可以 - 虽然我建议反对,但请使用bool(..)明确检查真相,并检查引用相等性,如:

if bool(bval) is True:

通常写is不是一个好主意。仅当您要检查两个变量是否指向相同(即 等效)对象,或者某些单个对象(如{{1)时}},TrueNone等等。它真的很有意义。

答案 2 :(得分:0)

[1,2,3]不等于True,但是,如果您输入1之类的内容,那么1 == True会通过,但当您使用is时,它会除非True

,否则永远为假