天天看點

defaultdict python_defaultdict:第一個參數必須是可調用的或非

對于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