链式使用“is”运算符
Python支持将is
运算符连在一起使用吗?比如下面这样?
a = None
b = None
a is b is None
这个会输出True
,如果能有一些文档参考就更好了。
4 个回答
是的,is
是一个比较运算符,关于链式比较的正式描述可以在参考手册中找到。
根据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
是的。你可以查看比较文档。
比较可以随意链在一起,比如 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 则是相反的结果。
没错。所有被归类为比较的运算符都可以连在一起使用。根据语言参考的说法:
简单来说,如果 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
是一样的,只不过每个表达式最多只会被计算一次。
比较运算符包括 <
(小于)、>
(大于)、==
(等于)、>=
(大于等于)、<=
(小于等于)、<>
(这个在 Python 3 中已经不再使用,是 !=
的一个不常用的同义词)、!=
(不等于)、is
(是)、is not
(不是)、in
(在……里面)和 not in
(不在……里面)。