在词汇表页 hashhable "的官方Python文档,访问者可以阅读
如果一个对象的哈希值在其生命周期内永远不会改变,那么这个对象就是可哈希的…
所有 Python的不可变内置对象都是可哈希的,而所有的可变容器(如列表或字典)都是不可哈希的
这意味着传递
的对象-
int
,float
,long
,complex
, -
str
, -
bytes
, -
tuple
或 -
frozenset
类到内置hash()
方法必须返回假定的哈希值。
list
s),因此对于一些元组是不可哈希的:
创建由可哈希(
int
s和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'
…尽管要散列的对象是不可变的内置类型
>>> type((1, 2, [3, '4'])) <class 'tuple'>
那么,为什么Python文档现在声明"所有不可变内置对象都是可哈希的",尽管特别是tuple
类型可以包含不可哈希的类型?
我不太了解Python的哈希,但在我看来,你只是在挑文本。
所有Python的不可变内置对象都是可哈希的
这就是他们所说的,这是真的:你可以哈希像(3, 3, 2)
这样的元组,元组是可哈希的。
但是,如果将不可哈希列表放入元组中,则不能再对其进行哈希,因为它包含不可哈希对象。这并不意味着元组是不可哈希的,但列表是不可哈希的,因此包含列表的元组不能再被哈希了。
将不可堆肥垃圾放入可堆肥垃圾袋并不会使袋子不可堆肥。