3

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

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'

请帮助我理解我做错了什么。我认为该函数需要测试参数的实际真值,但我不明白我缺少什么。

4

3 回答 3

8

bval is True检查是否[1, 2, 3]实际上是True对象。您需要bool()评估一个对象是否为真值但与True对象不同。

于 2017-03-20T02:53:11.773 回答
2

is检查参考平等,而不是真实性。现在很明显[1,2,3](这是一个list对象)并不指向True对象(这是一个bool对象)。很难说abcdefwhich 此处未定义的是否指向True。但是由于您不提供它,我会假设它指向不同的东西。

只有bool_to_str(True)or bool_to_str(<expr>)where<expr> 评估为 abool that isTrue会导致'Yes'bools 是单例,所以所有Trues 都是同一个对象)。

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

if bval:

您也可以 - 尽管我建议这样做,但明确地检查真实性bool(..)并检查参考相等性,例如:

if bool(bval) is True:

通常写不是一个好主意is。只有当您想检查两个变量是否指向同一个(即 等价的)对象,或者对于一些像True, None,()等单例对象时,它才真正有意义。

于 2017-03-20T02:54:42.950 回答
0

[1,2,3]不等于True,但是,如果您输入类似1, then1 == True会通过,但是当您使用is它时,它将始终为 False ,除非它是True

于 2017-03-20T02:54:34.233 回答