715просмотров
38.1%от подписчиков
25 февраля 2026 г.
Score: 787
🐍 Изменяемые аргументы по умолчанию – тихий источник багов На первый взгляд код выглядит нормально: def add_item(item, items=[]): items.append(item) return items Проверяем:
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2] Почему список не обнуляется? В чём проблема?
Аргументы по умолчанию в Python создаются один раз, в момент определения функции, а не при каждом вызове.
То есть items=[] – это один и тот же список в памяти, который используется повторно. Что происходит под капотом?
Когда Python видит:
def f(x=[]): ...
Он создаёт список один раз. Дальше каждый вызов функции работает с тем же объектом. Правильный способ ✔️ def add_item(item, items=None): if items is None: items = [] items.append(item) return items Теперь:
print(add_item(1)) # [1]
print(add_item(2)) # [2] Каждый вызов получает новый список.
Когда это особенно опасно?
• в API-функциях
• в классах
• в сервисах с большим количеством вызовов
• когда функция вызывается в разных местах проекта
Такие баги сложно заметить – они не вызывают ошибку, а просто ведут себя «странно».