什么时候==运算符不等于is运算符?(python)

发布于 2021-01-29 18:22:03

我注意到我可以使用==运算符比较所有本机数据类型(整数,字符串,布尔值,浮点数等),还可以比较包含本机数据类型的列表,元组,集合和字典。在这些情况下,==操作员将检查两个对象是否相等。但是在某些其他情况下(试图比较我创建的类的实例),该==运算符只是检查两个变量是否引用同一对象(因此在这些情况下,该==运算符等效于该is运算符)

我的问题是:什么时候==操作员不只是比较身份?

编辑:我正在使用Python 3

关注者
0
被浏览
138
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在Python中,==运算符是根据magic方法__eq__实现的,该方法默认情况下是通过身份比较来实现的。但是,您可以重写此方法,以提供自己的对象相等性概念。请注意,如果您这样做,通常也将至少覆盖__ne__(实现!=操作符)和__hash__计算实例的哈希码。

    我发现,即使在Python中,使我的__eq__实现符合Java语言中为该equals方法的实现所列出的规则也非常有帮助:

    • 这是自反的:对于任何非空参考值x,x.equals(x)应该返回true。
    • 它是对称的:对于x和y的任何非空引用值,当且仅当y.equals(x)返回true时,x.equals(y)才返回true。
    • 它是可传递的:对于x,y和z的任何非空引用值,如果x.equals(y)返回true,而y.equals(z)返回true,则x.equals(z)应该返回true。
    • 这是一致的:对于任何非空引用值x和y,只要未修改对象的equals比较中使用的信息,对x.equals(y)的多次调用将始终返回true或始终返回false。
    • 对于任何非null参考值x,x.equals(null)应该返回false。

    最后一个可能应该替换nullNone,但是规则在Python中并不像Java中那么容易。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看