【发布时间】:2015-12-28 08:44:44
【问题描述】:
在官方 Python 文档的"hashable" 部分下的Glossary-Page 上,访问者可以阅读
如果一个对象的哈希值在其生命周期内永远不会改变,那么它就是可哈希的......
所有 Python 的不可变内置对象都是可散列的,而没有可变容器(例如列表或字典)不是.. .
这意味着传递一个对象
-
int,float,long,complex, -
str, -
bytes, -
tuple或 frozenset
类到内置hash() 方法必须返回假定的哈希值。
问题在于元组可以包含不可散列的对象(例如lists),因此某些元组不可散列:
-
创建由可散列(
ints 和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 类型可以包含不可散列的类型强>?
【问题讨论】:
-
我投票决定将此问题作为题外话来结束,因为人们应该只根据自己面临的实际问题提出实用的、可回答的问题。这篇文章没有提出任何实际问题。
-
即使 TypeError 指向 unhashable 列表(它是元组的一部分),它也没有说 unhashable type: 'tuple'
-
很确定这是错误的(在语法和语义上):
while no mutable containers (such as lists or dictionaries) are not...