5

我对以下概念并不陌生:

TypeError: unhashable type: 'OrderedDict'

但我无法理解以下代码行如何产生这样的堆栈跟踪。

89:     @staticmethod
90:     def diff(var1, var2, path=[], level=0, curpath=[]):
...
101:        elif isinstance(var1, list) and isinstance(var2, list):
102:            l1s = set(var1)
103:            l2s = set(var2)
104:            retlist = []

  File "myFile.py", line 102, in diff
    l1s = set(var1)
TypeError: unhashable type: 'OrderedDict'

line 102, 在上面的代码中如何抛出这样的异常?

4

3 回答 3

6

一些数据结构(尤其是dicts 和sets)需要它们包含的对象(字典中的键,集合中的项)来实现__hash__()魔术方法,以便调用hash(obj)返回一个值。

这是优化结构所必需的,并且与不变性一起有助于保证所包含对象的唯一性。

在您的情况下,var1包含一些不可散列的对象(它不实现hash())。这个对象是一个OrderedDict,它是一个可变对象,并且在设计上是不可散列的。

作为另一个设计可变且不可散列的对象类型的示例,请考虑list以下示例:

>>> L = [1, 2, 3]
>>> set([L])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash(L)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

如果您使用set()以确保唯一性,那么您必须采取其他方式,尽管您的问题尚不清楚。

于 2013-04-08T13:52:50.933 回答
3

python中的dict(包括OrderedDict)是可变容器。

如果一个 dict 被散列,只要你改变了 dict 的内容,它的散列值就会改变。

于 2013-04-08T13:49:44.323 回答
1

python中的集合是基于散列的。OrderedDicts 不可散列。

于 2013-04-08T13:49:12.863 回答