あなたは最初のものが正しいです。に関してはy
、キーが に存在しない場合、デフォルト 0 で defaultdict を作成するため、y
これをネストされた辞書と考えることができます。次の例を検討してください。
y = defaultdict(lambda: defaultdict(lambda: 0))
print y['k1']['k2'] # 0
print dict(y['k1']) # {'k2': 0}
defaultdict なしで同等のネストされた辞書構造を作成するには、内部の dict を作成してから 0 にy['k1']
設定する必要がありますy['k1']['k2']
が、defaultdict は、まだ見ていないキーに遭遇したときに、これらすべてを舞台裏で行います。
y = {}
y['k1'] = {}
y['k1']['k2'] = 0
次の関数は、インタープリターでこれをいじって理解を深めるのに役立ちます。
def to_dict(d):
if isinstance(d, defaultdict):
return dict((k, to_dict(v)) for k, v in d.items())
return d
これにより、ネストされた defaultdict に相当する dict が返されます。これは、読みやすいです。たとえば、次のようになります。
>>> y = defaultdict(lambda: defaultdict(lambda: 0))
>>> y['a']['b'] = 5
>>> y
defaultdict(<function <lambda> at 0xb7ea93e4>, {'a': defaultdict(<function <lambda> at 0xb7ea9374>, {'b': 5})})
>>> to_dict(y)
{'a': {'b': 5}}