不一致的* args类型

时间:2014-11-27 22:01:25

标签: python python-2.7 hash arguments memoization

我正在尝试在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的类型会发生变化吗?

1 个答案:

答案 0 :(得分:3)

其中包含列表的元组仍然是不可删除的,原因与列表不可用的原因相同。

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