我完全不熟悉以下概念:
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
如何抛出这样的异常?
答案 0 :(得分:4)
某些数据结构(最值得注意的是dict
和set
)需要它们包含的对象(字典中的键,集合中的项)来实现__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的内容,它的哈希值就会改变。