sets
正在被分配一个lambda,它不是真的应该接受输入,您从调用的方式看到这种输入。兰姆达斯一般表现得像正常功能,因此可以分配到像g
或sets
这样的变量。 sets
的定义由一组额外的括号包围,没有明显的原因。你可以忽略那些外面的东西。
Lambdas可以具有与普通函数相同的所有类型的位置,关键字和默认参数。 λsets
具有名为split
的默认参数。这是一个常见的习惯用法,以确保循环的每次迭代中的sets
获得与该迭代相对应的split
的值,而不是所有情况下最后一次迭代中的值。
如果没有默认参数,split
将根据调用时的名称空间在lambda中进行评估。循环完成后,外部函数的名称空间中的split
将只是该循环的最后一个值。
创建函数对象时立即评估默认参数。这意味着缺省参数split
的值将在创建它的循环迭代中的任何位置。
您的示例有点令人误解,因为它丢弃了除最后一个之外的所有sets
的实际值,从而使默认参数为lambda无意义。这里是一个例子,说明如果你保留所有的lambda表达会发生什么。首先使用默认参数:
sets = []
for split in ['train', 'test']:
sets.append(lambda split=split: split)
print([fn() for fn in sets])
我已经截断了lambda表达式只是返回它们的输入参数,用于说明目的。如预期的那样,此示例将打印['train', 'test']
。
如果你不这样做的默认参数同样的事情,输出将是['test', 'test']
代替:
sets = []
for split in ['train', 'test']:
sets.append(lambda: split)
print([fn() for fn in sets])
这是因为'test'
是split
值当所有的lambda表达式得到评估。
你确定代码是正确的吗?每次迭代都要重新赋值'sets'真的很奇怪。 –
我认为这只是OP创建一个最小范例的尝试。根据问题本身,这个代码不是他自己的。 –