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