Вы правы за то, что делает первый. Что касается y
, он создаст defaultdict со значением по умолчанию 0, когда ключ не существует в y
, так что вы можете думать об этом как о вложенном словаре. Рассмотрим следующий пример:
y = defaultdict(lambda: defaultdict(lambda: 0))
print y['k1']['k2'] # 0
print dict(y['k1']) # {'k2': 0}
Чтобы создать эквивалентную вложенную словарную структуру без defaultdict, вам нужно создать внутренний dict для y['k1']
, а затем установить y['k1']['k2']
в 0, но 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
Это вернет dict-эквивалент вложенного defaultdict, который намного легче читать, например:
>>> 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}}