Почему 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 шт):

Автор решения: CrazyElf

Давайте посмотрим помощь по этим методам через 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 возвращается значение, не привязанное к словарю. Поэтому в первом случае добавляя что-то в список, вы получаете это добавление и в словаре, а во втором случае в словаре это обновление не отражается, его нужно туда записать в явном виде.

→ Ссылка