Hashing的怀疑

时间:2015-07-09 16:15:33

标签: python object hash

我正在阅读此post,我对__cmp__()提出了一个问题。

我的代码

class Book(object): 

    def __init__(self, title, year):

        self.title = title
        self.year = year

    def __hash__(self):         # hash function

        print "Self = ", self
        print "Hash value of self = ", hash(str(self))
        print "Hash value of title = ", hash(self.title)
        print "Hash value of year = ", hash(self.year)
        return 0
    def __cmp__(self, other):
        return self.title == other.title

books = []

books.append(Book("ABC", 123))
print hash(books[0])

books.append(Book("DEF", 456))
print hash(books[1])


books.append(Book("ABC", 123))
print hash(books[len(books)-1])

print len(books)

print cmp(books[0],books[2])

输出

Self =  <__main__.Book object at 0x0000000001E77B00>
Hash value of self =  -1040857764
Hash value of title =  826005955
Hash value of year =  123
0
Self =  <__main__.Book object at 0x0000000001E77BA8>
Hash value of self =  -992414627
Hash value of title =  -589261154
Hash value of year =  456
0
Self =  <__main__.Book object at 0x0000000001E77BE0>
Hash value of self =  1901105233
Hash value of title =  -2015893559
Hash value of year =  789
0
Self =  <__main__.Book object at 0x0000000001E77C18>
Hash value of self =  -228580758
Hash value of title =  826005955
Hash value of year =  123
0
4
1  # How ? 
字符串上的

==运算符返回一个布尔值 在此代码中,cmp()比较两个字符串(即标题),因此cmp()的返回值必须是Bool。

  • 我怎么得到一个整数? (我正在寻找关于对象x > y
  • 的比较的解释
  • 即使获得整数,其价值如何决定?
  • 如何使第1和第3个物体相等?

1 个答案:

答案 0 :(得分:1)

  

为什么我得到一个整数?

__cmp__会返回int。您的__cmp__正在返回bool,它是int的子类,因此Python会将其解释为int

  

即使获得整数,它的值又如何决定?

  • -1表示第一个操作数小于第二个
  • 0表示两个操作数相等
  • +1表示第一个操作数大于第二个
  

如何使第1和第3个物体相等?

您的代码存在的问题是__cmp__会返回==的结果,该结果会返回bool,它是int的子类,True }是1,因此,0返回__cmp__ / True而不是返回1 - 这是错误的。

您应该使用的方法(在以后的Pythons中移除__cmp__)是__eq____ne____le____lt__,{{1 }和__ge__

使用__gt__

__eq__

请注意,这只是按标题进行比较,而不是考虑年份(可能会很好,也可能不会,取决于您将如何使用def __eq__(self, other): if not isinstance(other, self.__class__): return NotImplemented return self.title == other.title 课程。)

您可以找到有关他们的更多信息here