Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

В чем отличие работы методов get и setdefault в словарях?

Изучаю python, сейчас разбираюсь с коллекциями. Столкнулся с 2-мя методами в словарях  -> get() и setdefault(). По описанию, вроде бы они выполняют одну и туже задачу, но на практике не могу понять разницу в исполнении.
Почему этот код не работает:
def merge(values):  # values - это список словарей
    my_dict = {}
    for val in values:
        for key, value in val.items():
            my_dict[key] = my_dict.get(key, set()).add(value)
    return my_dict


print(merge([{'a': 1, 'b': 2}, {'b': 10, 'c': 100}, {'a': 1, 'b': 17, 'c': 50}, {'a': 5, 'd': 777}]))
А этот работает:
def merge(values):  # values - это список словарей
    my_dict = {}
    for val in values:
        for key, value in val.items():
            my_dict.setdefault(key, set()).add(value)
    return my_dict


print(merge([{'a': 1, 'b': 2}, {'b': 10, 'c': 100}, {'a': 1, 'b': 17, 'c': 50}, {'a': 5, 'd': 777}]))
По идее - оба метода возвращают значение ключа из словаря, и если ключа нет, то возвращают значение по умолчанию. Да, я понимаю, что setdefault() предварительно создает пару ключ-значение в словаря, а get() не создает, но тот же get() в коде выше должен вернуть пустое множество, в которое должно добавляться число, но в результате метод множеств add() почему-то не исполняется.
PythonМетоды словарей+1
Алексей Сбитнев
  ·   · 3,1 K
Программист на Python, инвестор, энтузиаст  · 21 февр 2023
В первом случае у вас в словарь по ключу key кладется результат функции add (то есть ничего или None)
А во втором случае вы сначала добавляете в словарь множество, потом оно вам возвращается и вы добавляете в него элемент. Поскольку множество — изменяемый тип, все работает как нужно, в словаре оказывается множество, в котором лежит этот элемент.
На практике, я бы не рекомендовал вам как-то неявно менять мутабельные типы данных, это может приводить к непредсказуемым и тяжело находимым ошибкам (я думаю, вы это уже поняли)
Простое лучше сложного. Сложное лучше запутанного...  · 1 мая 2023
В первом случаем Питон читет строку кода  "my_dict[key] = my_dict.get(key, set()).add(value)" как "my_dict[key] = None", т.к. метод add ничего не возвращает поэтому его можно использовать только вне равенств.  Вот более... Читать далее