1. ホーム
  2. python

[解決済み] defaultdict : 第 1 引数は callable か None でなければならない。

2022-02-16 06:34:15

質問

私は次のコードを実行しました。

from collections import defaultdict
lst = list(range(0,5))
d = defaultdict(lst)

と、こんなエラーが出ました。

TypeError: first argument must be callable or None

ご協力お願いします

解決方法を教えてください。

の場合 defaultdict デフォルト値 は通常 値とは言えない であれば、それは 工場 : 新しい値を生成するメソッドです。この問題を解決するには ラムダ式 を生成する。

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