什么使列表不可用?

时间:2014-04-24 12:28:33

标签: python list dictionary hash python-internals

因此列表不可用:

>>> { [1,2]:3 }
TypeError: unhashable type: 'list'

以下page给出了解释:

  

列表是可变类型,不能用作字典中的键   (它可以就地改变,使得钥匙不再位于   字典的内部哈希表)。

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

>>> hash( [1,2] )
TypeError: unhashable type: 'list'

Python是否可以保证可变类型永远不会被用作字典键?或者是否存在使可变对象无法散列的另一个原因,无论我打算如何使用它们?

1 个答案:

答案 0 :(得分:17)

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

由于无法提出哈希值,因此内部有no hashing function defined for lists

PyObject_HashNotImplemented,                /* tp_hash */

由于未实现散列函数,当您将其用作字典中的键,或者强行尝试使用hash函数获取散列值时,它无法散列它,因此它以不可变类型失败

TypeError: unhashable type: 'list'