2015-11-22 136 views
3

TYPE lambdadefaultdict一起使用時會發生什麼?我有這樣的例子,甚至int工作正常,list & lambda作爲參數:defaultdict(lambda:None)和defaultdict(int)之間的區別

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字典不關心傳入什麼類型的參數。

+0

您可以通過以下鏈接獲取答案https://stackoverflow.com/a/49184504/7187965 –

回答

2

您沒有使用默認值工廠。如果您所做的只是分配給密鑰,而不是嘗試和檢索一個不在字典中的密鑰,您將不會看到區別。

工廠的默認值(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

3

你舉的例子僅是有道理的,當你訪問沒有明確添加到字典鍵:

>>> d = defaultdict(int) 
>>> d['one'] 
0 
>>> d = defaultdict(list) 
>>> d['one'] 
[] 
>>> d = defaultdict(lambda: None) 
>>> d['one'] is None 
True 

正如你所看到的,使用默認的字典會給每個鍵您嘗試訪問默認值。通過調用傳遞給構造函數的函數來獲取該默認值。所以通過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將使務必正確初始化列表。