簡體   English   中英

defaultdict(lambda:None)和defaultdict(int)之間的區別

[英]Difference between defaultdict(lambda:None) and defaultdict(int)

defaultdict使用時,TYPE lambda究竟做了什么? 我有這個例子,即使intlistlambda作為參數也能正常工作:

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); 傳遞listlist()設置為默認值(這是一個空列表[] ); 並傳遞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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM