Развёрнутое пояснение:
1. partial(collect, []) создаёт объект add, в котором аргумент acc уже связан с одним объектом списка [].
2. print(add(1), add(2)) сначала вычисляет оба аргумента.
3. add(1) вызывает collect([], 1): в список добавляется 1, возвращается тот же список [1].
4. add(2) вызывает collect([1], 2): в этот же список добавляется 2, возвращается уже [1, 2].
5. print получает две ссылки на один и тот же список [1, 2] и печатает "[1, 2] [1, 2]".
Почему это важно: functools.partial часто используют для фиксации аргументов, но если такой аргумент изменяемый, все вызовы делят общее состояние. Это стреляет в фабриках обработчиков, логгерах и callback'ах, где частично применённый изменяемый объект оказывается общим для разных вызовов.
Post #4813
284
Python: задачки и вопросы
- ✍ 1