在官方Python文档Glossary-Page部分的"hashable"下,访问者可以阅读
如果对象具有在其生命周期内永远不会改变的哈希值,则该对象是可清除的......
Python的不可变内置对象的所有都是可以删除的,而没有可变容器(例如列表或词典)。
这意味着传递
的对象int
,float
,long
,complex
,str
,bytes
,tuple
或frozenset
内置hash()
方法的类必须返回假定的哈希值。
问题是元组可以包含不可用的对象(例如list
s),因此某些元组不可用:
创建(有效)元组,包含可清除(int
和string
)和不可用(list
)数据类型。
>>> tuple([1, 2, [3, "4"]])
(1, 2, [3, '4'])
哈希这个元组失败了......
>>> hash((1, 2, [3, '4']))
Traceback (most recent call last):
hash((1, 2, [3, '4']))
TypeError: unhashable type: 'list'
...虽然hash的对象是一个不可变的内置类型
>>> type((1, 2, [3, '4']))
<class 'tuple'>
那么,为什么Python Docs现在声明“所有不可变的内置对象都是可清除的”,尽管tuple
类型特别可以包含不可用的类型
答案 0 :(得分:7)
我不太了解Python的散列,但对我来说,看起来你只是在挑剔文本。
所有Python的不可变内置对象都是可以使用的
这就是他们所说的,这是真的:你可以散列像(3, 3, 2)
这样的元组就好了,元组是可以用的。
但是,如果将一个不可用的列表放入元组中,则不能再对其进行哈希处理,因为它包含一个不可用的对象。这并不意味着元组是不可用的,但列表是,因此包含列表的元组不能再进行哈希处理。
将不可堆肥的垃圾放入可堆肥的垃圾袋中,不会使垃圾袋变得不可堆肥。