为什么Python Docs声明"所有不可变的内置对象都是可以清除的"?

ele*_*ent 2 python hash tuples list

在官方Python文档" hashable "部分的词汇表页面下,访问者可以阅读

如果对象具有在其生命周期内永远不会更改的哈希值,则该对象是可清除的...

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

这意味着传递一个对象

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

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

问题是元组可以包含不可用的对象(例如lists),因此一些元组不可清除:

  1. 创建(有效)由hashable(ints和string)和unhashable(list)数据类型组成的元组.

    >>> tuple([1, 2, [3, "4"]])  
        (1, 2, [3, '4'])
    
    Run Code Online (Sandbox Code Playgroud)
  2. 哈希这个元组失败了......

    >>> hash((1, 2, [3, '4'])) 
        Traceback (most recent call last):
            hash((1, 2, [3, '4']))
        TypeError: unhashable type: 'list'
    
    Run Code Online (Sandbox Code Playgroud)
  3. ...尽管hash的对象是一个不可变的内置类型

    >>> type((1, 2, [3, '4']))
        <class 'tuple'>
    
    Run Code Online (Sandbox Code Playgroud)

那么,为什么Python Docs现在声明" 所有不可变的内置对象都是可以清除的 ",尽管特别是该tuple类型可以包含不可用的类型

Mar*_*nen 7

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

所有Python的不可变内置对象都是可清除的

这就是他们所说的,这是真的:你可以散列一个像元组一样的元组(3, 3, 2),元组是可以清除的.

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

将不可堆肥的垃圾放入可堆肥的垃圾袋中不会使袋子不可堆肥.