Развёрнутое пояснение:
1. При определении функции ingest создаётся один объект множества set() и сохраняется как значение по умолчанию для параметра seen.
2. Первый вызов ingest(['a','b']) использует это же множество, добавляет в него 'a' и 'b' и возвращает len(seen), то есть 2.
3. Второй вызов ingest(['b','c']) получает уже непустое множество с элементами 'a' и 'b'. Добавляется только 'c', поэтому длина становится 3.
4. Переменная res получает кортеж (2, 3), а print(*res) выводит 2 3.
5. Правильный вариант — 2 3.
Почему это важно: изменяемое значение по умолчанию — частая ловушка при реализации кэшей, дедупликаторов, счётчиков и накопителей ошибок. В тесте, где функцию вызывают один раз, баг может не проявиться, а в проде при повторных вызовах общее изменяемое состояние искажает результат. Чтобы избежать этого, изменяемый объект создают внутри тела функции: seen=None, а внутри if seen is None: seen=set().
Post #4861
401
Python: задачки и вопросы
- ✍ 1