Python不可用类型:'OrderedDict'

时间:2013-04-08 13:45:45

标签: python exception dictionary

我完全不熟悉以下概念:

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'

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

3 个答案:

答案 0 :(得分:4)

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

这需要优化结构,并与不变性一起帮助保证所包含对象的唯一性。

在您的情况下,var1包含一些不是 hashable 的对象(它不实现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()来确保唯一性,那么您必须采取其他方式,但您的问题并不清楚。

答案 1 :(得分:0)

python中的集合基于哈希。 OrderedDicts不可用。

答案 2 :(得分:0)

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

如果dict被哈希,只要你更改了dict的内容,它的哈希值就会改变。