我正在尝试在python 2.7中编写一个通用的memoization函数(在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 :(得分:3)
其中包含列表的元组仍然是不可删除的,原因与列表不可用的原因相同。
>>> args = ([],)
>>> type(args)
<type 'tuple'>
>>> d = {args: None}
TypeError: unhashable type: 'list'
>>> hash(args)
TypeError: unhashable type: 'list'