在正式Python文档的Glossary-Page部分下面的"hashable"上,访问者可以阅读
如果对象的哈希值在其生存期内从未更改,则该对象是可哈希的。。。
Python的所有不可变的内置对象都是散列的,而没有可变的容器(如列表或字典)不是。。。
这意味着传递int
,float
,long
,complex
,str
,bytes
,tuple
或frozenset
类必须返回假定的哈希值。
问题是元组可以包含不可分解的对象(例如hash()
s),因此有些元组是不可哈希的:
创建(有效)元组,该元组由可散列(list
s和int
)和不可散列(string
)数据类型组成。
>>> 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'
... 尽管要散列的对象是不可变的内置类型
>>> type((1, 2, [3, '4']))
<class 'tuple'>
那么,为什么Python文档现在声明“所有不可变的内置对象都是散列的”,尽管特别是
list
类型可以包含不可更改的类型? 最佳答案
我对Python的散列不太了解,但对我来说,你好像只是在挑剔文本。
所有Python的不可变内置对象都是散列的
这就是他们所说的,这是真的:你可以散列一个元组,比如(3, 3, 2)
很好,元组是散列的。
但是,如果将不可更改列表放入元组,则无法再对其进行哈希处理,因为它包含不可更改对象。这并不意味着元组是不可更改的,但是列表是不可更改的,因此包含列表的元组不能再被散列。
将不可堆肥垃圾放入可堆肥垃圾袋中不会使垃圾袋不可堆肥。
关于python - 为什么Python Docs声明“所有不可变的内置对象都是可哈希的”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32868211/