Python中的连续'is'运算符

时间:2017-10-14 05:32:15

标签: python python-3.x

有人可以帮我解释一下吗?

>>> None is None is None
True
>>> (None is None) is None
False

'is'运算符不是2个操作数,比较左边的对象,返回Boolean?

2 个答案:

答案 0 :(得分:3)

因为它被解释为chained comparison

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"
  

比较可以任意链接,例如,x < y <= z是等效的   到x < y and y <= z,除了y只评估一次(但在两者中)   如果发现x < y为假,则根本不评估案例z。

     

正式,如果a, b, c, …, y, z是表达式,op1, op2, …, opN是。a op1 b op2 c ... y opN z   比较运算符,然后a op1 b and b op2 c and ... y opN z相当于   is,除了每个表达式都是   最多评估一次。

因此,由于None is None and None is None 是比较运算符,因此您的第一个表达式等同于:

return ()

答案 1 :(得分:-1)

2 < 3 < 4比较。

第二个没有和第一个没有相同吗?是。第3个和第2个相同吗?是。

OTOH,(True) is None显然是假的。括号打破了链接。

评估lo < n < hi是一种常见的python习惯用法,这并不会让你担心True < 4的中间结果。评估x is y is z不太常见,但对于您的单身None,这三个对象是相同的。