2013-04-08 2 views
1

는 :파이썬 unhashable 유형 : 나는의 개념에 익숙하지 않은 전혀 아니다 'OrderedDict'

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은 어떻게 이러한 예외가 발생합니까?

+1

'var1'은'OrderedDict's의 목록입니다. –

+1

제쳐두고, http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument – mgilson

+0

@PavelAnossov를보고 싶을 수도 있습니다. 나는 머리를 치고 있습니다. 지금 내 책상 :) 고마워, 내가 어떻게 그리워하는지 모르겠다! – theAlse

답변

2

일부 데이터 구조들이 포함하는 개체 필요 (사전의 경우 키를 세트의 경우 항목)의 __hash__() 마법 방법을 구현합니다.

구조를 최적화하고 포함 된 개체의 고유성을 보장하는 불변성과 함께 필요합니다.

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()를 사용하는 경우 다음 당신은 다른 방법으로 가야한다 귀하의 질문에서 명확하지 않지만.

0

파이썬의 세트는 해시를 기반으로합니다. OrderedDicts는 해시 가능하지 않습니다.

0

python에서 dict (OrderedDict 포함)는 변경 가능한 컨테이너입니다.

dict이 해시 된 경우 dict의 내용을 변경하는 한 해당 해시 값이 변경됩니다. hash(obj)를 호출하면 값을 반환하도록 (특히 dict들과 set들)

관련 문제