使用函数作为字典键

时间:2015-01-13 05:54:10

标签: python

将函数用作字典键是否被认为是错误的形式?例如:

def add(a, b):
    return a + b

mydict = {add: "hello"}

2 个答案:

答案 0 :(得分:5)

是的,这完全有效。例如,您可以使用它来存储计数器调用函数的次数:

def hi():
    print('hi')

funcs = {hi: 0}

print(funcs)
# {<function hi at 0x10fb39950>: 0}

for func in funcs:
    func()
    # hi
    funcs[func] += 1

print(funcs)
# {<function hi at 0x10fb39950>: 1}

那就是说,这是一种倒退的做事方式。有一个更简单的类型作为字典键,如字符串或int。

答案 1 :(得分:0)

函数通过function类的实例表示:

>>> def f():
...   pass
...
>>> f
<function f at 0x000001D397363E18>
>>> help(type(f))

class function(object)
 |  function(code, globals[, name[, argdefs[, closure]]])

因此,函数类是从object类派生的,并且继承了__hash__方法。 __hash__类中object方法的默认实现使用rotating right 4 bits的返回值id()计算哈希。对象的id()是内存地址。

这就是函数获取哈希的方式。从技术上讲,具有 some 不变状态的任何事物都可以具有哈希。