2014-11-27 2 views
1

내가하려고하면 파이썬 2.7에서 일반 메모이 제이션 기능 (3.X에서 아무 문제)일관성 유형은

def init_memoize(): 
    fns = dict() 
    def memoize(fn, *args): 
     if fn not in fns: 
      fns[fn] = dict() 
     print type(args)  # prints "<type 'tuple'>" 
     print args in fns[fn] # throws the error 
     if args not in fns[fn]: 
      fns[fn][args] = fn(*args) 
     return fns[fn][args] 
    return memoize 
memoize = init_memoize() 

memoize(sorted, range(5)) 
memoize(sorted, range(10)) 

를 작성하고이 코드를 실행하기 위해 노력하고있어, 나는 오류 TypeError: unhashable type: 'list'에서 얻을 주목할만한 줄,하지만 바로 전에, 나는 args의 타입이 해시 가능한 튜플인지를 검증한다.

args의 유형이 변경되는 이유를 분명히 해줄 수 있습니까?

+0

실제로 'memoize'를 호출하는 코드는 표시하지 않습니다. args로 당신은 무엇을 지나가고 있습니까? – BrenBarn

답변

2

그 안에 목록이있는 튜플은 목록을 해쉬 할 수없는 것과 같은 이유 때문에 여전히 해칠 수 없습니다.

>>> args = ([],) 
>>> type(args) 
<type 'tuple'> 
>>> d = {args: None} 
TypeError: unhashable type: 'list' 
>>> hash(args) 
TypeError: unhashable type: 'list' 
+0

감사합니다. 범위가 2.7의 목록을 반환한다는 것을 잊었습니다. – twinlakes