Python中,什么对象能做到`a is a`返回`True`,而`a == a`返回`False`?
同事考我这个问题,我答不上来,特来求助
>>> a is a
True
>>> a == a
False
Python中,什么对象能做到`a is a`返回`True`,而`a == a`返回`False`?
a=None 的时候是这样的
这问题挺有意思的。在Python里,要让a is a返回True而a == a返回False,核心就是搞乱对象的相等性比较。
a is a检查的是对象身份(内存地址),同一个对象当然永远是自己。但a == a调用的是__eq__方法,我们可以在这个方法里做手脚,让它返回False。
看这个例子:
class WeirdObject:
def __eq__(self, other):
# 永远返回False,包括和自己比较
return False
a = WeirdObject()
print(a is a) # True - 是同一个对象
print(a == a) # False - 相等性比较被我们破坏了
这里的关键是__eq__方法被重写为总是返回False,所以即使比较的是同一个对象,==操作也会返回False。
这种写法在实际开发中没啥用,主要是用来理解Python对象比较机制——is看身份,==看值(或者说__eq__的实现)。
总结:重写__eq__方法就能做到。
定义__equals__方法
Python 2.7
>>> a = None
>>> None is None
True
>>> None == None
True
>>> True == True
True
>>> class A(object):
… def eq(self, a):
… return self is not a
…
>>> b = A()
>>> b is b
True
>>> b ==b
False
math.nan
可以参考下这个,不过没有你这个问题的答案。
http://blog.jobbole.com/113631/
我记错了,感谢指正
自带的话 math.nan ,或者第三方库 numpy.NaN
NaN 试一下?
内存空间的问题 你 id () 一下
正常情况下是没有的。
原因:is 是判断是不是一个( id 值相同),== 是判断是否相等(eq 返回 True )
按照常理,id 相同必相等
但是确实可以。。。
python<br>a = float("NaN")<br>print(a==a)<br>print(a is a)<br>
这思路可以。。。
引用类型
C++ 就没这么多破事
#14 C++ 浮点数 NaN 也是自身不相等的,只要是按照 IEEE 标准设计的浮点数,都要满足 NaN != NaN

is判断是否是同一个对象,即 2 个的引用是否指向同一个对象;==返回的是__eq__的返回值。

在题主的问题里,只要是指向同一个对象,a is a 都是为 True,a==a 可以通过重写__eq__方法达成目的
感谢两位让我今天想例子的时候才发现原来浮点数不能作为 non-type 模板参数以及浮点数相除不是一个常量表达式。。
把 js 的 NAN 和 python 搞混了,尴尬的一楼。
mark


