布尔值、等价物和对象标识符的神秘案例

Mysterious Cases of Booleans, Equivalencies, and Object Identifiers

弦之谜:
为什么bool('foo')returnsTrue

if
'foo' == True returns False
'foo' == False returns False
'foo' is True returns False
'foo' is False returns False

整数之谜:
为什么bool(5)returnsTrue

if
5 == True returns False
5 == False returns False
5 is True returns False
5 is False returns False

第三零之谜:
为什么bool(0)returnsFalse

if
0 == True returns False
0 == False returns True <-- Special Case
0 is True returns False
0 is False returns False

我知道Python的一些真实性,但是,这一切似乎有点神秘。有人介意对此有所了解吗?

你需要阅读这个:https://docs.python.org/2/library/stdtypes.html#truth-value-testing

'foo' == True  # -> False
'' == True     # -> False
'' == False    # -> False

将永远是 False。字符串不等于 bool。但是 - 是的 - bool('non-empty-str') -> Truebool('') -> False.

其他 'mysteries'.

以此类推

is比较两个对象的身份id()(这里也有一些玄机:What's with the Integer Cache inside Python?

这可能也很有趣:Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?

因为0''在Python中都是False,而非空字符串和非零整数都是True。

在您的所有示例中,它们返回的结果与您的期望不同的原因是因为 == 检查相同的 valueis 检查两者是否指向同一个对象.

所以在第一种情况下,fooTrue,但它们不是相同的值。同样,foo 未指向与 True 相同的值,这就是为什么它 returns 为假。其余示例继续使用相同的模式。