Развёрнутое пояснение:
1. При определении функции log_event создаётся один пустой список buffer, который используется как значение по умолчанию.
2. Первый вызов log_event со строкой timeout добавляет эту строку в общий список и возвращает его, результат сохраняется в переменную a.
3. Второй вызов log_event со строкой 403 использует тот же список buffer, добавляет строку 403 и возвращает его, результат сохраняется в переменную b.
4. Переменные a и b указывают на один и тот же объект, поэтому print(a, b) выводит ['timeout', '403'] ['timeout', '403'].
Почему это важно: изменяемый аргумент по умолчанию часто встречается в функциях-логгерах, кэширующих обёртках и накопителях метрик, но на деле он работает как глобальное состояние между вызовами. В многопоточном коде это создаёт состояние гонки, а в тестах — нестабильные результаты. Правильный паттерн: buffer=None и создание нового списка внутри функции.
Post #4868
279
Python: задачки и вопросы
- ✍ 1