美文网首页
可哈希对象

可哈希对象

作者: 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对象已经不可哈希了。

相关文章

  • 可哈希对象

    hashable 如果一个对象是可哈希的,那么它就有一个在其生命周期中都不会改变的哈希值,它会有一个__hash_...

  • collections 模块的使用

    判断数据类型 1、Hashable 判断是否可哈希,即是否有哈希值,即是否为可变对象可变对象没有哈希值,不可变对象...

  • 2018-08-01

    Python部分 1.元组属于不可变对象,列表属于可变对象,列表的很多方法不适用于元组;元组可哈希而列表不可哈希 ...

  • Python的collections模块

    python的collections模块 collections模块 Counter:字典的子类,提供了可哈希对象...

  • Python 不可变对象

    不可变对象=》可哈希 对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新...

  • 12、字典的定义和常用操作

    字典包含哈希值和指向的对象 {"哈希值", "对象"} {'length':180, 'width': 8...

  • Python基础学习3

    映射的类型:字典字典包含哈希值和指向的对象:{"哈希值":"对象"}、{'length':100,'width':...

  • 对象的equals和hashCode

    对象的 hashCode() 方法,为对象返回一个 哈希值。那什么是 哈希值 ? 这个词的解释有很多。 哈希值是...

  • Python中的可哈希与不可哈希,对类做字典和集合去重

    摘要:id,可变对象,不可变对象,hash 结论 可哈希的数据类型,即不可变的数据结构(数字类型(int,floa...

  • Redis 哈希对象

    哈希对象的编码可以是 ziplist 或 hashtable ziplist 编码的哈希对象使用压缩列表作为底层实...

网友评论

      本文标题:可哈希对象

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