为什么 Python 文档声明"all immutable built-in objects are hashable"?



在词汇表页 hashhable "的官方Python文档,访问者可以阅读

如果一个对象的哈希值在其生命周期内永远不会改变,那么这个对象就是可哈希的…

所有 Python的不可变内置对象都是可哈希的,而所有的可变容器(如列表或字典)都是不可哈希的

这意味着传递

的对象
  • int, float, long, complex
  • str
  • bytes
  • tuple
  • frozenset

类到内置hash()方法必须返回假定的哈希值

问题是元组可以包含不可哈希的对象(例如list s),因此对于一些元组是不可哈希的:
  1. 创建由可哈希(int s和string)和不可哈希(list)数据类型组成的(有效)元组

    >>> tuple([1, 2, [3, "4"]])  
        (1, 2, [3, '4'])
    
  2. 这个元组哈希失败…

    >>> hash((1, 2, [3, '4'])) 
        Traceback (most recent call last):
            hash((1, 2, [3, '4']))
        TypeError: unhashable type: 'list'
    
  3. …尽管要散列的对象是不可变的内置类型

    >>> type((1, 2, [3, '4']))
        <class 'tuple'>
    

那么,为什么Python文档现在声明"所有不可变内置对象都是可哈希的",尽管特别是tuple类型可以包含不可哈希的类型?

我不太了解Python的哈希,但在我看来,你只是在挑文本。

所有Python的不可变内置对象都是可哈希的

这就是他们所说的,这是真的:你可以哈希像(3, 3, 2)这样的元组,元组是可哈希的

但是,如果将不可哈希列表放入元组中,则不能再对其进行哈希,因为它包含不可哈希对象。这并不意味着元组是不可哈希的,但列表是不可哈希的,因此包含列表的元组不能再被哈希了。

将不可堆肥垃圾放入可堆肥垃圾袋并不会使袋子不可堆肥。

相关内容

最新更新