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

时间:2015-09-30 14:05:27

标签: python list hash tuples

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

  

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

     

Python的不可变内置对象的所有都是可以删除的,而没有可变容器(例如列表或词典)。

这意味着传递

的对象
  • intfloatlongcomplex
  • str
  • bytes
  • tuple
  • frozenset

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

问题是元组可以包含不可用的对象(例如list s),因此某些元组不可用

  1. 创建(有效)元组,包含可清除(intstring)和不可用(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. ...虽然hash的对象是一个不可变的内置类型

    >>> type((1, 2, [3, '4']))
        <class 'tuple'>
    
  4. 那么,为什么Python Docs现在声明“所有不可变的内置对象都是可清除的”,尽管tuple类型特别可以包含不可用的类型

1 个答案:

答案 0 :(得分:7)

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

  

所有Python的不可变内置对象都是可以使用的

这就是他们所说的,这是真的:你可以散列像(3, 3, 2)这样的元组就好了,元组是可以用的

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

将不可堆肥的垃圾放入可堆肥的垃圾袋中,不会使垃圾袋变得不可堆肥。