在Python中我有下面的代碼行:爲什麼collections.defaultdict的lambda沒有參數?
my_var = collections.defaultdict(lambda: collections.defaultdict(collections.defaultdict(float)))
我不明白它在做什麼。我不明白的一件事是我們沒有爲lambda函數指定任何變量。
在Python中我有下面的代碼行:爲什麼collections.defaultdict的lambda沒有參數?
my_var = collections.defaultdict(lambda: collections.defaultdict(collections.defaultdict(float)))
我不明白它在做什麼。我不明白的一件事是我們沒有爲lambda函數指定任何變量。
的default_factory
參數defaultdict
應該是不接受它創建並返回一個對象,這將成爲獲得任何引用不存在的項的值的任何參數的函數。
提供這種功能的一種方法是使用內聯lambda
expression創建一個匿名類。另一種方法是使用內置函數的名稱創建並返回其中一種內置類型,如float
,int
,tuple
等。當任何那些被調用時沒有參數時,返回的對象會有一些默認值 - 通常是零或空的東西。
my_var = collections.defaultdict(
lambda: collections.defaultdict(
collections.defaultdict(float)))
但是,(在這兩種形式),這是不正確的,因爲一些defaultdict
電話沒有:
首先,您可以通過格式化像這樣讓這樣的代碼,你有更多的可讀可調用的函數參數。因爲Python是一種解釋型語言,所以直到您嘗試使用my_var
時纔會知道這一點。對於像例如東西:
my_var['level1']['level2']['level3'] = 42.
會導致:
my_var = collections.defaultdict(
lambda: collections.defaultdict(
lambda: collections.defaultdict(float))) # need lambda here, too
事後前面的分配將不會被考慮:
TypeError: first argument must be callable or None
這可以通過添加另一個lambda
固定一個錯誤。
由於defaultdict
是內置dict
類的子類,你可以使用json
模塊漂亮地打印一個實例:
import collections
my_var = collections.defaultdict(
lambda: collections.defaultdict(
lambda: collections.defaultdict(float)))
import json # for pretty printing dictionaries
# Auto-creates the 3 levels of dictionaries needed.
my_var['level1']['level2']['level3A'] = 42.
# Similar to above but additionally auto-creates a
# my_var['level1']['level2']['level3B'] entry with default value of 0.0
my_var['level1']['level2']['level3C'] = my_var['level1']['level2']['level3B'] + 1
print(json.dumps(my_var, indent=4))
輸出:
{
"level1": {
"level2": {
"level3A": 42.0,
"level3B": 0.0,
"level3C": 1.0
}
}
}
我想你應該能夠理解它現在的功能 - 但是如果沒有,請告訴我。
真棒回答。謝謝哥們 –
因爲工廠函數不接受任何參數。 – vaultah