【问题标题】:Should I test for object identity in eq function我应该在 eq 函数中测试对象身份吗
【发布时间】:2018-03-22 12:56:55
【问题描述】:

在实现__eq__ 函数时,我想知道使用is 关键字测试身份是否应该是测试的一部分?当变量指向同一个对象实例时,is 函数对 2 个不同变量的相等性测试可以立即评估为 True。如果变量指向不同的实例,当然需要进一步测试。假设我们有S = U,那么显然我们希望S == U 返回True,并且身份测试将加快速度。

def __eq__(self, other):
    if self is other:
        return True
    else:
        pass # do another user defined test for equality 

【问题讨论】:

  • 我一般不会说,除非你的__eq__ 因某种原因很贵。例如,如果您只检查某些成员是否相等,即使它们是“复杂的”(如字符串或列表),Python 的内部实现肯定会进行检查。我可能会这样做的一个例子是树数据结构。

标签: python equality


【解决方案1】:

您可以实现这一点,尽管对于大多数用例来说,这可能是一个微优化。 Python 核心开发人员应用了这种优化思想,用于为lists 实现in 运算符;代码是 C(在 CPython 中),但 equivalent Python logic 是:

any(element is target or element == target for element in lst)

但是,请注意这可能不是您想要的,例如,numpy.NAN is numpy.NANTrue,但 numpy.NAN == numpy.NANFalse。然而,这是一个unusual case

【讨论】:

  • 对于nan = float('nan') 也是如此:nan == nan → False 和 nan is nan → True。
猜你喜欢
  • 1970-01-01
  • 2016-07-23
  • 2022-01-03
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
相关资源
最近更新 更多