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,所以它不是身份问题....
答案 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
是错误的。