[英]Difference between defaultdict(lambda:None) and defaultdict(int)
與defaultdict
使用時,TYPE lambda
究竟做了什么? 我有這個例子,即使int
, list
和lambda
作為參數也能正常工作:
d = defaultdict(int)
d['one'] = lambda x:x*x
d['one'](2)
4
d = defaultdict(list)
d['one'] = lambda x:x*x
d['one'](2)
4
d = defaultdict(lambda: None)
d['one'] = lambda x:x*x
d['one'](2)
4
我每次都有相同的結果。 那么用lambda“default( lambda: None
)”初始化的主要原因是什么? 看起來defaultdict
字典並不關心傳入什么類型的參數。
您沒有使用默認值工廠。 如果所有操作都分配給鍵,而不是嘗試檢索尚未在字典中的鍵,則不會看到差異。
默認值factory( defaultdict()
的第一個參數) 不是類型聲明 。 每當您嘗試訪問尚未在字典中的密鑰時,都會調用它:
>>> from collections import defaultdict
>>> def demo_factory():
... print('Called the factory for a missing key')
... return 'Default value'
...
>>> d = defaultdict(demo_factory)
>>> list(d) # list the keys
[]
>>> d['foo']
Called the factory for a missing key
'Default value'
>>> list(d)
['foo']
>>> d['foo']
'Default value'
>>> d['bar'] = 'spam' # assignment is not the same thing
>>> list(d)
['foo', 'bar']
>>> d['bar']
'spam'
只有當我第一次嘗試訪問密鑰'foo'
時,工廠才會調用它來生成一個默認值,然后將其存儲在字典中以供將來訪問。
因此,對於每個不同的示例,它們之間的差異是為每個示例生成的默認值。 您永遠不會訪問此功能,因為您直接分配到'one'
鍵。
如果您訪問了一個不存在的鍵,則您已經創建了一個值為0的整數,一個空列表或None
。
只有當您訪問未明確添加到字典中的鍵時,您的示例才有意義:
>>> d = defaultdict(int)
>>> d['one']
0
>>> d = defaultdict(list)
>>> d['one']
[]
>>> d = defaultdict(lambda: None)
>>> d['one'] is None
True
如您所見,使用默認dict將為您嘗試訪問默認值的每個鍵。 通過調用傳遞給構造函數的函數來獲取該默認值。 因此傳遞int
會將int()
設置為默認值(即0); 傳遞list
將list()
設置為默認值(這是一個空列表[]
); 並傳遞lambda: None
將(lambda: None)()
為默認值( None
)。
這就是默認字典的作用。 沒有其他的。
這樣做的想法是,您可以設置默認值,在第一次訪問密鑰時不需要手動設置。 例如,像這樣的事情:
d = {}
for item in some_source_for_items:
if item['key'] not in d:
d[item['key']] = []
d[item['key']].append(item)
只是在訪問每個字典項時為其設置一個新的空列表,可以簡化為:
d = defaultdict(list)
for item in some_source_for_items:
d[item['key']].append(item)
而defaultdict
將確保正確初始化列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.