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創建一個最小范例的嘗試。根據問題本身,這個代碼不是他自己的。 –