我也在这一点上画了一个空白。如果有人能帮助我理解为什么我的代码没有打印预期的输出,我将不胜感激。
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'
请帮助我理解我做错了什么。我认为这个功能需要测试论证的实际真值,但我不明白我错过了什么。
答案 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)时}},True
,None
等等。它真的很有意义。
答案 2 :(得分:0)
[1,2,3]
不等于True
,但是,如果您输入1
之类的内容,那么1 == True
会通过,但当您使用is
时,它会除非True