Почему append не работает для метода get(), а для setdefault() работает?
Всех приветствую, возник вопрос и не нашел на него ответа. Подскажите, пожалуйста, почему в методе get() мы не можем добавлять, как и в методе setdefault() и в значениях None. Уже всё сломалось, похоже, мы создали пустой список в значениях частей примеров.
pets = {'Hatiko':('Parker', 'Wilson', 50),
'Rusty':('Josh', 'King', 25),
'Fido':('John', 'Smith', 28),
'Rex':('Parker', 'Wilson', 50)
}
result = {}
for val, key in pets.items():
result.setdefault(key, []).append(val)
print(result)
result1 = {}
for val, key in pets.items():
result1[key] = result1.get(key, []) +[val]
print(result1)
Ответы (1 шт):
Давайте посмотрим помощь по этим методам через help:
help(dict.setdefault)
setdefault(self, key, default=None, /)
Insert key with a value of default if key is not in the dictionary.
Return the value for key if key is in the dictionary, else default.
help(dict.get)
get(self, key, default=None, /)
Return the value for key if key is in the dictionary, else default.
Разница, как видно, в том, что setdefault добавляет пару ключ: значение-по-умолчанию в словарь, если ключ не найден в словаре, и уже после этого возвращает значение из словаря (теперь оно там есть). get добавление в словарь не делает, если ключ не найден, а просто возвращает значение-по-умолчанию.
Таким образом, если ранее ключа в словаре не было, в случае setdefault вам возвращается ссылка на элемент словаря (которого ранее в нём не было, а теперь есть), а в случае get возвращается значение, не привязанное к словарю. Поэтому в первом случае добавляя что-то в список, вы получаете это добавление и в словаре, а во втором случае в словаре это обновление не отражается, его нужно туда записать в явном виде.