什么时候==运算符不等于is运算符?(python)
我注意到我可以使用==
运算符比较所有本机数据类型(整数,字符串,布尔值,浮点数等),还可以比较包含本机数据类型的列表,元组,集合和字典。在这些情况下,==
操作员将检查两个对象是否相等。但是在某些其他情况下(试图比较我创建的类的实例),该==
运算符只是检查两个变量是否引用同一对象(因此在这些情况下,该==
运算符等效于该is
运算符)
我的问题是:什么时候==
操作员不只是比较身份?
编辑:我正在使用Python 3
-
在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。
最后一个可能应该替换
null
为None
,但是规则在Python中并不像Java中那么容易。