比较python中的两个布尔表达式

时间:2017-06-24 08:32:01

标签: python

In[19]: x = None
In[20]: y = "Something"
In[21]: x is None == y is None
Out[21]: False
In[22]: x is None != y is None ## What's going on here?
Out[22]: False
In[23]: id(x is None)
Out[23]: 505509720
In[24]: id(y is None)
Out[24]: 505509708

为什么Out [22]错了?他们有不同的ID,所以它不是身份问题....

2 个答案:

答案 0 :(得分:6)

链式表达式从左到右进行计算,此外,比较is!=具有相同的优先级,因此表达式的计算结果为:

(x is None) and (None!= y) and (y is None)
#---True----|------True-----|--- False---|
#-----------True------------|
#------------------False-----------------|

要改变评估顺序,你应该做一些改编:

>>> (x is None) != (y is None)
True

另请注意,第一个表达式x is None == y is None是侥幸,或者更确切地说是红鲱鱼,因为如果你将一些parens放在所需的位置,你会得到相同的结果。这可能就是为什么你假设订单首先应该以{{1​​}}开头,然后是第二种情况下的is

答案 1 :(得分:1)

您的x is None != y is None是“chained comparisons”。更典型的例子是3 < x < 9。这意味着与(3 < x) and (x < 9)相同。因此,对于您的情况,使用运算符is!=,就是这样:

(x is None) and (None != y) and (y is None)

哪个是假的,因为y is None是错误的。