当前位置: 首页 > 面试题库 >

设置“输入”运算符:使用相等性还是同一性?

管翼
2023-03-14
问题内容
class A(object):
    def __cmp__(self):
        print '__cmp__'
        return object.__cmp__(self)

    def __eq__(self, rhs):
        print '__eq__'
        return True
a1 = A()
a2 = A()
print a1 in set([a1])
print a1 in set([a2])

为什么第一行打印True,而第二行打印False?而且都没有输入运算符 eq 吗?

我正在使用Python 2.6


问题答案:

您也需要定义__hash__。例如

class A(object):
    def __hash__(self):
        print '__hash__'
        return 42

    def __cmp__(self, other):
        print '__cmp__'
        return object.__cmp__(self, other)

    def __eq__(self, rhs):
        print '__eq__'
        return True

a1 = A()
a2 = A()
print a1 in set([a1])
print a1 in set([a2])

将按预期工作。

作为一般规则,你实现任何时间__cmp__,你应该实施__hash__,使得所有xy这样x == yx.__hash__() == y.__hash__()



 类似资料:
  • 问题内容: 我做了两次测试,第一次是从 上面的例子表明 现在我做类似的操作,但是这次 这个例子表明 我很困惑,被路过了,哪个路过了? 问题答案: 在您的第一个代码中,是的,这一行 分配给所引用的,即。在这一点上,它们是同一对象。但是,下一行 创建的 新 实例,并更改对此新String 的引用。当我们更改的引用时,的内容不会更改。 注意Java 是不可变的,即一旦初始化就无法更改状态。以这种方式思考

  • shell脚本中的,有什么区别? 以下两者有什么区别吗? 仅仅是 和 仅在变量包含数字时才使用吗?

  • 我试图用if-let表达来概括我的大脑。我知道它的作用,但我找不到一些细节背后的基本原理。 第一个细节是赋值运算符而不是相等运算符的使用,第二个细节是操作数的位置。 例如: 在我看来,这样更“清晰”: 或者更好: 有人能帮我理解这背后的原理吗?

  • 本文向大家介绍什么是MySQL NULL安全相等运算符,它与比较运算符有何不同?,包括了什么是MySQL NULL安全相等运算符,它与比较运算符有何不同?的使用技巧和注意事项,需要的朋友参考一下 与标准SQL IS NOT DISTINCT FROM运算符等效的MySQL NULL安全相等运算符执行等于运算符的相等比较。其符号为<=>。当我们两个操作数都为NULL时,它的性能与比较运算符不同。请看

  • 我想要的是Hibernate生成1条语句删除所有子级的方法,而不是每个子级1条语句。 如果实体a和B之间存在关系,其中a是父对象,B可以是多个子对象。如果我在实体关系上使用注释,如OrphanRemoving或OnCascade delete,那么当我删除父对象时,自动生成的sql会显示 我想让Hibernate做的是生成SQL 是否有一个注释或设置我可以用来轻松做到这一点? 我觉得我不是第一个遇

  • 我知道我们不应该使用==但是。equal()方法在IntelliJ或Idk中不起作用。如果不是IntelliJ,那就错了。有人能看一下吗。