是什么使列表无法散列?

因此列表是不可散列的:

>>> { [1,2]:3 }

TypeError: unhashable type: 'list'

下页给出了解释:

列表是可变类型,不能用作字典中的键(它可以就地更改,因此该键不再可在字典的内部哈希表中找到)。

我了解为什么不希望使用可变对象作为字典键。但是,即使我只是在尝试对列表进行哈希处理(独立于字典创建),Python也会引发相同的异常

>>> hash( [1,2] )

TypeError: unhashable type: 'list'

Python是否这样做是为了确保可变类型永远不会用作字典键?还是有另一个原因使可变对象无法散列,而无论我打算如何使用它们?

回答:

字典和集合使用哈希算法来唯一确定一个项目。这些算法利用用作键的项目得出唯一的哈希值。由于列表是可变的,因此列表的内容可以更改。在允许列表作为关键字存在于字典中之后,如果列表的内容发生变化,则哈希值也将发生变化。如果哈希值存储在字典中的特定插槽后发生了变化,则将导致字典不一致。例如,最初,该列表已存储在位置A,该位置是基于哈希值确定的。如果哈希值发生变化,并且如果我们查找列表,则可能无法在location处找到它A,或者根据新的哈希值,可能会找到其他对象。

由于不可能提供哈希值,因此在内部没有为list定义哈希函数。

PyObject_HashNotImplemented,                /* tp_hash */

由于未实现哈希函数,因此当您将其用作字典中的键或强制尝试使用该hash函数获取哈希值时,它将无法对其进行哈希处理,因此对于不可哈希的类型将无法进行哈希处理

TypeError: unhashable type: 'list'

以上是 是什么使列表无法散列? 的全部内容, 来源链接: utcz.com/qa/407017.html

回到顶部