我熟悉简单的lambda表达式。但是我在书中有这个lambda表达式。
dd_pair = defaultdict(lambda: [0,0])
dd_pair[2][1] = 1 #now dd_pair contains {2: [0,1]}
我没有声明任何输入变量,这不是我学习Lambdas的方式。
本书前面的例子有
dd_dict = defaultdict(dict)
dd_dict["Joel"]["City"] = "Seattle"
#this produces {"Joel" : { "City": "Seattle"}}
这是有道理的,密钥为Joel
,嵌套密钥为City
,值为Seattle
。
我的两个部分问题是,lambda如何在没有输入变量的情况下工作?我应该假设dd_pair[2][1]
是要创建密钥2
并在列表的索引1
设置值=1
?
答案 0 :(得分:2)
lambda: [0, 0]
与以下内容完全相同:
def zero_pair():
return [0, 0]
也就是说,它是一个不带参数的函数,并返回一个len
2数组,其中两个条目设置为0. defaultdict
采用一个不带参数的可调用函数并返回一个值缺少密钥,因此您的第二个示例(dd_pair = defaultdict(lambda: [0,0])
)与:
dd_pair = defaultdict(zero_pair)
现在,Python中的字典可以为其键获取任何值(只要它们是hashable)。
{0: 'integer', '0': 'string'}[0] # 'integer'
所以当我们用{2}索引dd_pair
时,因为字典在2
没有任何键,所以我们的lambda(相当于zero_pair
)被调用并返回一个列表中有两个零。然后,我们将该列表中的第二个元素设置为1,使列表发生变异。
所以,是的,当你说:
时,你几乎可以看到我应该假设
dd_pair[2][1]
是创建一个密钥2并且在列表的索引1处设置值= 1