【问题标题】:Why does the Python Docs state that "all immutable built-in objects are hashable"?为什么 Python Docs 声明“所有不可变的内置对象都是可散列的”?
【发布时间】:2015-12-28 08:44:44
【问题描述】:

在官方 Python 文档的"hashable" 部分下的Glossary-Page 上,访问者可以阅读

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

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

这意味着传递一个对象

  • int, float, long, complex,
  • str,
  • bytes,
  • tuple
  • frozenset

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

问题在于元组可以包含不可散列的对象(例如lists),因此某些元组不可散列

  1. 创建由可散列(ints 和 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 类型可以包含不可散列的类型强>?

【问题讨论】:

  • 我投票决定将此问题作为题外话来结束,因为人们应该只根据自己面临的实际问题提出实用的、可回答的问题。这篇文章没有提出任何实际问题。
  • 即使 TypeError 指向 unhashable 列表(它是元组的一部分),它也没有说 unhashable type: 'tuple'
  • 很确定这是错误的(在语法和语义上):while no mutable containers (such as lists or dictionaries) are not...

标签: python list hash tuples


【解决方案1】:

我不太了解 Python 的散列,但在我看来,你只是在挑剔文本。

Python 的所有不可变内置对象都是可散列的

这就是他们所说的,这是真的:你可以散列一个元组,例如 (3, 3, 2) 就好了,元组是可散列的

但是,如果你将一个不可散列的列表放入一个元组中,它就不能再被散列,因为它包含一个不可散列的对象。这并不意味着元组是不可散列的,但列表是不可散列的,因此包含列表的元组不能再散列。

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

【讨论】:

  • 也许 OP 可以考虑给 Python 文档打一个补丁,说“所有完全由 Python 的不可变内置对象组成的数据结构都是可散列的”。
猜你喜欢
  • 2010-12-29
  • 2019-03-26
  • 2012-02-15
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多