您正在遇到比较运算符链接;1 in () == False
也 意思(1 in ()) == False
。
相反,比较是链接在一起的,该表达式的真正含义是:
(1 in ()) and (() == False)
因为(1 in ())
已经为false,所以False and something_else
将完全忽略链接表达式的后半部分(因为返回False
的值something_else
将是)。
请参阅比较表达式文档:
可以任意链接比较,例如x < y <= z
与等效x < y and y <= z
,不同之处在于y
比较仅被评估一次(但在两种情况下z
都x < y
被发现为假,则根本不评估)。
对于记录,<
,>
,==
,>=
,<=
,!=
,is
,is not
,in
和not in
都是比较运算符(如本弃用<>
)。
通常,不要将其与布尔值进行比较;只是测试表达式本身。如果 必须 对布尔文字进行测试,则至少要使用括号和is
运算符,True
并且False
它们是单例的,就像None
:
>>> (1 in ()) is False
True
当涉及整数时,这仍然变得更加令人困惑。Python的bool
类型是子类int
1。因此,False == 0
确实如此True == 1
。因此,可以想象到,您可以创建看起来理智的链接操作:
3 > 1 == True
是正确的,因为3 > 1
和1 == True
都正确。但是表达式:
3 > 2 == True
1是出于历史原因的子类;Python并不总是像C那样具有类型和具有布尔含义的重载整数。制作子类可使较旧的代码正常工作。bool``int``bool``bool