这让我感到困惑。即使不知道运算优先级,也可以检查两种可能的表达式组合方式,得出结果为False
:
>>> (0 is 0) == 0
False
>>> 0 is (0 == 0)
False
但是
>>> 0 is 0 == 0
True
怎么会这样呢?
这让我感到困惑。即使不知道运算优先级,也可以检查两种可能的表达式组合方式,得出结果为False
:
>>> (0 is 0) == 0
False
>>> 0 is (0 == 0)
False
但是
>>> 0 is 0 == 0
True
怎么会这样呢?
您正在使用比较运算符链。该表达式被解释为:
(0 is 0) and (0 == 0)
来自比较的文档:
比较可以任意链接,例如,
x < y <= z
等价于x < y and y <= z
,但是当x < y
为假时,只评估y
一次(但在两种情况下都不评估z
)。
0 is 0
为真,因为Python对小整数进行了内部处理 (实现细节),所以您获得(True) and (True)
产生True
。
x ? y ?? z
(其中?
和??
表示一些比较运算符)既不等同于(x ? y) ?? z
也不等同于x ? (y ?? z)
,而是等同于x ? y and y ?? z
。>
等运算符中特别有用,允许你编写像 min < x < max
这样的代码,并且得到预期的结果,而不是将布尔值与数字进行比较(这在大多数其他语言中会发生)。
0 is 0 == 0
被解析为(0 is 0) and (0 == 0)
,就像a == b == c
被解析为a == b and b == c
。 - Paul Hankin