布尔值、等价物和对象标识符的神秘案例
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') -> True
; bool('') -> 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。
在您的所有示例中,它们返回的结果与您的期望不同的原因是因为 ==
检查相同的 value
而 is
检查两者是否指向同一个对象.
所以在第一种情况下,foo
是 True
,但它们不是相同的值。同样,foo
未指向与 True
相同的值,这就是为什么它 returns 为假。其余示例继续使用相同的模式。
弦之谜:
为什么bool('foo')
returnsTrue
?
if
'foo' == True
returnsFalse
'foo' == False
returnsFalse
'foo' is True
returnsFalse
'foo' is False
returnsFalse
整数之谜:
为什么bool(5)
returnsTrue
?
if
5 == True
returnsFalse
5 == False
returnsFalse
5 is True
returnsFalse
5 is False
returnsFalse
第三零之谜:
为什么bool(0)
returnsFalse
?
if
0 == True
returnsFalse
0 == False
returnsTrue
<-- Special Case
0 is True
returnsFalse
0 is False
returnsFalse
我知道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') -> True
; bool('') -> 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。
在您的所有示例中,它们返回的结果与您的期望不同的原因是因为 ==
检查相同的 value
而 is
检查两者是否指向同一个对象.
所以在第一种情况下,foo
是 True
,但它们不是相同的值。同样,foo
未指向与 True
相同的值,这就是为什么它 returns 为假。其余示例继续使用相同的模式。