Python中,什么对象能做到`a is a`返回`True`,而`a == a`返回`False`?

同事考我这个问题,我答不上来,特来求助

>>> a is a
True

>>> a == a False


Python中,什么对象能做到`a is a`返回`True`,而`a == a`返回`False`?
22 回复

a=None 的时候是这样的


这问题挺有意思的。在Python里,要让a is a返回Truea == 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 搞混了,尴尬的一楼。

回到顶部