对于defaultdict,默认值通常是不是真正的值,它是一个工厂:生成新值的方法。通过使用生成列表的lambda表达式可以解决此问题:lst = lambda:list(range(0,5))
d = defaultdict(lst)
这也是一个好主意,因为否则所有默认值都会引用同一个列表。例如:d[1].append(14)
不会对d[2]产生影响(因为d[1]和d[2]都不存在)。
但是,您可以通过以下方式实现此目的:val = list(range(0,5))
lst = lambda:val
d = defaultdict(lst)
但这可能会产生不必要的副作用:如果您在这里执行d[1].append(14),那么d[2]将是[1,2,3,4,5,14],而d[1] is d[2]将是True:$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections import defaultdict
>>> val = list(range(0,5))
>>> lst = lambda:val
>>> d = defaultdict(lst)
>>> d[1]
[0, 1, 2, 3, 4]
>>> d[1].append(14)
>>> d[2]
[0, 1, 2, 3, 4, 14]
>>> d[1] is d[2]
True
鉴于:$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections import defaultdict
>>> lst = lambda:list(range(0,5))
>>> d = defaultdict(lst)
>>> d[1]
[0, 1, 2, 3, 4]
>>> d[1].append(14)
>>> d[2]
[0, 1, 2, 3, 4]
>>> d[1] is d[2]
False