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'

上記のコードの 、行はどのよう102にしてそのような例外をスローできますか?

4

3 に答える 3

6

一部のデータ構造 (最も顕著なdictのは とset) では、それらに含まれるオブジェクト (辞書の場合はキー、セットの場合はアイテム) が__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 を含む) は変更可能なコンテナーです。

辞書がハッシュされた場合、辞書の内容を変更する限り、そのハッシュ値は変更されます。

于 2013-04-08T13:49:44.323 に答える
1

Python のセットはハッシュに基づいています。OrderedDicts はハッシュ可能ではありません。

于 2013-04-08T13:49:12.863 に答える