2016-11-21 61 views
0

我有一個代碼在Python 2中工作,但現在在Python 3中引發錯誤「TypeError:關鍵字參數必須是字符串」。它是函數的第一行,所以不應該成爲以前代碼的問題。Python 3 defaultdict與lambda表達式

map = collections.defaultdict(lambda: 'blinn',**{0: 'constant', 1:'lambert'}) 

也許有人也可以解釋我這行代碼正在做什麼以及創建的「地圖」對象是什麼。我發現Python defaultdict and lambda,但我在理解這行代碼時仍然遇到問題。

+0

'map'是'defaultdict'。如果你使用**,那麼鍵必須是字符串 - 「0」和「1」。 – furas

回答

2

**{0: 'constant', 1:'lambert'}將兩個默認鍵值對作爲關鍵字參數傳遞給defaultdict()構造函數。但是,相同的構造函數也會將字典作爲第二個參數作爲默認值處理。在Python 2

collections.defaultdict(lambda: 'blinn', {0: 'constant', 1:'lambert'}) 

演示,顯示你得到相同的輸出結果::

這樣,**可完全省略,在這兩個圖2和3

>>> import sys 
>>> sys.version_info 
sys.version_info(major=2, minor=7, micro=12, releaselevel='final', serial=0) 
>>> import collections 
>>> collections.defaultdict(lambda: 'blinn', **{0: 'constant', 1:'lambert'}) == collections.defaultdict(lambda: 'blinn', {0: 'constant', 1:'lambert'}) 
True 
>>> collections.defaultdict(lambda: 'blinn', **{0: 'constant', 1:'lambert'}) 
defaultdict(<function <lambda> at 0x102426410>, {0: 'constant', 1: 'lambert'}) 
>>> _[0] 
'constant' 
>>> collections.defaultdict(lambda: 'blinn', {0: 'constant', 1:'lambert'}) 
defaultdict(<function <lambda> at 0x102426410>, {0: 'constant', 1: 'lambert'}) 
>>> _[0] 
'constant' 

和Python 3中:

>>> import sys 
>>> sys.version_info 
sys.version_info(major=3, minor=6, micro=0, releaselevel='beta', serial=3) 
>>> import collections 
>>> collections.defaultdict(lambda: 'blinn', {0: 'constant', 1:'lambert'}) 
defaultdict(<function <lambda> at 0x10e3589d8>, {0: 'constant', 1: 'lambert'}) 
>>> _[0] 
'constant' 
+0

爲什麼defaultdict不接受字符串關鍵字參數?它不破壞一致性嗎? – grzgrzgrz3

+0

@ grzgrzgrz3關鍵字參數始終是字符串,但在使用'** kw'時,Python 2未強制執行此操作在調用*和*中,callable接受任意關鍵字參數。 Python 3解決了這個問題。 –

+0

正如我可以看到在python2它只適用於基於字典的對象。其他對象引發'TypeError'。 – grzgrzgrz3