Python 3 个带 lambda 表达式的 defaultdict

Python 3 defaultdict with lambda expression

我有一个代码在 python 2 中工作,但现在在 python 3 中引发了错误 "TypeError: keyword arguments must be strings"。它是一个函数的第一行,所以应该不是以前代码的问题。

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

也许有人也可以向我解释这行代码在做什么以及创建的 "map" 对象是什么。我找到了 Python defaultdict and lambda 但我仍然无法理解这行代码。

**{0: 'constant', 1:'lambert'} 将两个默认键值对作为关键字参数传递给 defaultdict() 构造函数。但是,同一个构造函数也会将字典视为第二个参数作为默认值。

因此,** 可以完全省略,在 2 和 3 中:

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

Python2 中的演示,显示您获得相同的输出:

>>> 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'