Этого можно добиться с помощью рекурсивного defaultdict
.
from collections import defaultdict
def tree():
def the_tree():
return defaultdict(the_tree)
return the_tree()
Важно защитить заводское имя по умолчанию, the_tree
здесь, в закрытии ("private"область действия локальной функции).Избегайте использования однострочной версии lambda
, которая содержит ошибки из-за поздних привязок Python , и используйте вместо этого def
.
Принятый ответ, используя лямбду, имеет недостаток, когда экземпляры должны полагаться на имя nested_dict
, существующее во внешней области видимости.Если по какой-либо причине фабричное имя не может быть разрешено (например, оно было восстановлено или удалено), то ранее существующие экземпляры также будут слегка повреждены:
>>> nested_dict = lambda: defaultdict(nested_dict)
>>> nest = nested_dict()
>>> nest[0][1][2][3][4][6] = 7
>>> del nested_dict
>>> nest[8][9] = 10
# NameError: name 'nested_dict' is not defined