Развёрнутое пояснение:
1. Создаётся пустой список queue.
2. defaultdict инициализируется фабрикой lambda: queue, которая при каждом обращении по отсутствующему ключу возвращает ссылку на этот же список.
3. tasks['api'] вызывает фабрику, возвращает queue и добавляет в него строку retry.
4. tasks['queue'] снова вызывает фабрику и возвращает тот же список queue, который уже содержит retry.
5. Поэтому print выводит ['retry'].
Почему это важно: такая ошибка возникает, когда разработчик хочет инициализировать значение изменяемым объектом и вместо конструктора list передаёт lambda, замкнутую на заранее созданный объект. В планировщиках задач, группировке событий по категориям или кэшировании результатов по ключам это приводит к тому, что разные ключи делят одно состояние. Правильный способ — передать list или функцию, создающую новый объект при каждом вызове, например defaultdict(list).
Post #4851
404
Python: задачки и вопросы
- ✍ 2