检查__eq__中的身份是否有意义?

Bjö*_*lex 8 python equality

为类实现自定义相等函数时,首先检查身份是否有意义?一个例子:

def __eq__(self, other):
    return (self is other) or (other criteria)
Run Code Online (Sandbox Code Playgroud)

这有趣的是其他标准可能更昂贵的情况(例如比较一些长串).

Sco*_*ths 7

首先检查身份可能是一个非常合理的快捷方式,而在平等方法中,您应该寻找好的快捷方式(平等和非平等),以便您尽快返回.

但是,另一方面,如果您对等式的测试另外便宜并且您在实践中不太可能将对象与自身进行比较,那么它也可能是一个完全多余的检查.

例如,如果可以通过比较一个或两个整数来衡量对象之间的相等性,那么这应该比身份测试更快,因此在比较ids 所需的时间少于你得到了整个答案.请记住,如果您检查身份并且对象不具有相同的id(在大多数情况下很可能),那么您还没有获得任何东西,因为您仍然需要进行全面检查.

因此,如果完全相等检查不便宜并且可能将对象与自身进行比较,那么首先检查身份可能是一个好主意.


请注意,默认情况下不进行检查的另一个原因是,具有相同标识的对象比较为非相等,这是非常合理的(尽管很少见),例如:

>>> s = float('nan')
>>> s == s
False
Run Code Online (Sandbox Code Playgroud)


Joc*_*zel 3

是否需要: 否

这有意义吗:当然,为什么不呢?

默认情况下不进行此类检查,如下所示:

class bad(object):
    def __eq__(self, other):
        return False

x = bad()
print x is x, x==x # True, False
Run Code Online (Sandbox Code Playgroud)

  • 您不希望默认情况下完成检查,请参阅我的示例“float('nan')”,它不等于自身(非常合法)。 (4认同)