Это похоже на довольно сложное использование setdefault и defaultdict, которое я не могу понять, было бы здорово, если бы кто-нибудь мог объяснить «почему» приведенный ниже код.Поведение DefaultDict в Python 2.7
d = {}
for name in ['foo', 'bar', 'bars']:
t = d
for char in name:
t = t.setdefault(char,{}) # Should be a empty {}
print d
# Prints {'b': {'a': {'r': {'s': {}}}}, 'f': {'o': {'o': {}}}}
Я не могу понять, как работает этот кусок кода. Когда строка t = t.setdefault (char, {}) выполняется, она должна назначить пустой словарь t, но как это влияет на d, так что d заканчивается тем, что становится вложенным словарем?
Кроме того, что было бы эквивалентно выше, если бы я использовал defaultdict. Я придумал это, что неправильно:
d1 = defaultdict(dict)
for name in ['foo', 'bar', 'bars']:
t1 = d1
for char in name:
t1 = t1[char]
print d1
Было бы замечательно, если бы кто-то мог бы указать на то, чтобы как следует понять defaultdicts
Как со списками, 'и' Т * d' как указывают на один и тот же объект. Когда 't' изменяется, изменяется и' d'. –
Хорошо, я как бы понял эту идею. Поэтому, когда выполняется инструкция t = t.setdefault (char, {}), часть ** t.setdefault (char, {}) ** мутирует словарь d, а так как правая сторона оценивает {}, t является установлен в {}. Будет ли это понимание правильным? –
@VikashRajaSamuelSelvin: Ваше понимание верное. Программа будет работать одинаково и будет более ясной, если бы она не использовала переменную 't' вообще, и просто сделала' _ = d.setdefault (char, {}) '. Подчеркнутая переменная давала бы ключ к пониманию того, что это задание было просто выброшено (то есть есть). – Gerrat