Аргументом для defaultdict
является функция.
Начните с вызова _trie
:
>>> d = _trie()
>>> d
defaultdict(<function _trie at 0x105a9e400>, {})
Теперь у вас есть экземпляр defaultdict
, Что произойдет, если вы попытаетесь получить доступ к несуществующему ключу?
>>> d[3]
defaultdict(<function _trie at 0x105a9e400>, {})
Вы получите еще один defaultdict
, потому что d[3]
- это сокращение от d.__getitem__(3)
, вызывает d.__missing__(3)
, который вызывает d.__setattr__(d, 3, _trie()
.
. Он отражает рекурсивное определение tr ie: tr ie является либо пустым, либо единственным узлом с попытками в качестве дочерних элементов. Это создает defaultdict
, который либо пуст, либо имеет произвольные ключи, сопоставленные с другими defaultdict
с той же заводской функцией.
Это немного похоже на взаимную рекурсию. Вызов _trie
приводит к вызову defaultdict
, но вызов defaultdict.__getitem__
или defaultdict.__setitem__
(а не сам вызов defaultdict
) приводит к вызову _trie
.