链式使用“is”运算符

13 投票
4 回答
1074 浏览
提问于 2025-04-18 15:48

Python支持将is运算符连在一起使用吗?比如下面这样?

a = None
b = None
a is b is None

这个会输出True,如果能有一些文档参考就更好了。

4 个回答

1

是的,is 是一个比较运算符,关于链式比较的正式描述可以在参考手册中找到。

https://docs.python.org/2/reference/expressions.html#not-in

3

根据Python 语法文档,Python 会根据这个文档来解析源代码(也就是说,这就是源头):

comparison: expr (comp_op expr)*
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'

expr (comp_op expr)* 可以用简单的语言理解为“任何数量的表达式,通过比较运算符分开”,其中 is 就是一个比较运算符。这意味着,你可以把任意数量的 is 比较连在一起。

为了演示这些比较是如何连在一起的:

>>> a = b = c = 'foo'
>>> a is b
True
>>> a is b is c
True
>>> True is c
False
3

是的。你可以查看比较文档

比较可以随意链在一起,比如 x < y <= z 其实等于 x < y 和 y <= z,唯一的不同是 y 只会被计算一次(但如果发现 x < y 是假的,z 就根本不会被计算)。

简单来说,如果 a、b、c 等等是一些表达式,而 op1、op2 等等是比较运算符,那么 a op1 b op2 c ... y opN z 就等于 a op1 b 和 b op2 c 和 ... y opN z,只不过每个表达式最多只会被计算一次。

is 比较运算符的作用:

运算符 is 和 is not 用来测试对象的身份:x is y 只有在 x 和 y 是同一个对象时才为真。x is not y 则是相反的结果。

18

没错。所有被归类为比较的运算符都可以连在一起使用。根据语言参考的说法:

简单来说,如果 abc,……,yz 是表达式,而 op1op2,……,opN 是比较运算符,那么 a op1 b op2 c ... y opN z 的意思和 a op1 b and b op2 c and ... y opN z 是一样的,只不过每个表达式最多只会被计算一次。

比较运算符包括 <(小于)、>(大于)、==(等于)、>=(大于等于)、<=(小于等于)、<>(这个在 Python 3 中已经不再使用,是 != 的一个不常用的同义词)、!=(不等于)、is(是)、is not(不是)、in(在……里面)和 not in(不在……里面)。

撰写回答