美文网首页
可哈希对象

可哈希对象

作者: bigtom | 来源:发表于2016-09-19 10:38 被阅读641次

    hashable

    如果一个对象是可哈希的,那么它就有一个在其生命周期中都不会改变的哈希值,它会有一个__hash__()方法,它要能够和其他对象比较(需要__eq__()方法或__cmp__()方法)。可哈希对象相同要求哈希值相同。

    不可哈希

    list, set, dict

    可哈希

    数值,字符串,boolean

    对象可不可hash?

    class A:
        def __init__(self):
            pass
    
    a = A()
    print hash(a)
    

    实验发现对象是可哈希的,为啥呢?因为所有对象都继承自object,而object有__hash__方法。bingo!

    等等!不是说python一切皆对象么?

    >>> issubclass(int, object)
    True
    >>> issubclass(list, object)
    True
    

    抱着试一试的态度,我查看了一下list,发现也有__hash__方法。但是list不是不可哈希的么??于是我们打印出__hash__看一看。

    print object.__hash__
    # <slot wrapper '__hash__' of 'object' objects>
    
    print int.__hash__
    # <slot wrapper '__hash__' of 'int' objects>
    
    print list.__hash__
    # None
    

    哈哈,这下清楚了,虽然list也有__hash__属性,但是是None,同样dict和set的__hash__也是None。想知道一个对象是不是可哈希,只要看__hash__是不是None。
    不要相信我,相信自己的代码

    class A:
        def __init__(self):
            self.__hash__ = None
    
    a = A()
    print hash(a)
    

    现在a对象已经不可哈希了。

    相关文章

      网友评论

          本文标题:可哈希对象

          本文链接:https://www.haomeiwen.com/subject/axagettx.html