0等于0吗?(#是否为True?)

21

这让我感到困惑。即使不知道运算优先级,也可以检查两种可能的表达式组合方式,得出结果为False

>>> (0 is 0) == 0
False
>>> 0 is (0 == 0)
False

但是

>>> 0 is 0 == 0
True

怎么会这样呢?


11
这可能是一个重复的问题,但 0 is 0 == 0 被解析为 (0 is 0) and (0 == 0),就像 a == b == c 被解析为 a == b and b == c - Paul Hankin
1
@PaulHankin 你应该把那个留作回答。 - Markus Meskanen
看看这篇文章:理解Python的“is”运算符 - Just Ice
2个回答

21

您正在使用比较运算符链。该表达式被解释为:

(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


7
在Python中链接比较运算符时,运算符并不是应用于其他运算符的结果,而是分别应用于操作数。即 x ? y ?? z(其中???表示一些比较运算符)既不等同于(x ? y) ?? z也不等同于x ? (y ?? z),而是等同于x ? y and y ?? z
这在>等运算符中特别有用,允许你编写像 min < x < max 这样的代码,并且得到预期的结果,而不是将布尔值与数字进行比较(这在大多数其他语言中会发生)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接