我一直在玩默认字典而且我很困惑
为什么这不起作用:
示例1
def hi(name):
return "hi " + name
a = defaultdict(hi)
print(a["hello"]("jane"))
输出示例1
TypeError: hi() missing 1 required positional argument: 'name'
但这样做:
示例2
def hi(name):
return "hi " + name
a = {"hello":hi}
print(a["hello"]("jane"))
输出示例2
hi jane
也使用lambda会使它工作
示例3
def hi(name):
return "hi " + name
a = defaultdict(lambda: hi)
print(a["hello"]("jane"))
输出示例 3
hi jane
为什么示例1 会返回错误,而示例3 则不会?
发生了什么事?
答案 0 :(得分:5)
当defaultdict找不到密钥时,它会调用不带任何参数的函数。与
def hi(name):
return "hi " + name
a = defaultdict(hi)
a["hello"]
,hi
已被调用,尽管您希望稍后调用它。由于默认用户在没有任何参数的情况下调用hi
,因此您在手动运行hi()
时会看到相同的错误,即TypeError
抱怨错误的参数计数。< / p>
另一种写出lambda的方法(仅用于教学目的)将是
def hi(name):
return "hi " + name
def make_hi():
return hi
a = defaultdict(make_hi)
print(a["hello"]("jane"))
在此处,访问a["hello"]
调用make_hi
,然后返回hi
,然后使用参数("jane")
调用。{/ p>