Найти в Дзене
Y_LAB University

Новый пост Y_LAB Actual | Код под микроскопом

🔍 Продолжаем разбирать фрагменты кода, в которых всё выглядит правильно до тех пор, пока программа не начинает работать не так, как ожидалось. Сегодня под микроскопом небольшой пример на 📱 Python, который регулярно становится причиной багов даже у опытных разработчиков def add_item(item, items=[]): items.append(item) return items print(add_item("apple")) print(add_item("banana")) Вопрос: Что выведет программа? Многие ожидают такой результат: ['apple'] ['banana'] Но на самом деле вывод будет другим: ['apple'] ['apple', 'banana'] Почему так происходит 💬 На первый взгляд кажется, что при каждом вызове функции создаётся новый пустой список: items=[] Но в Python аргументы по умолчанию создаются один раз, в момент объявления функции, а не при каждом её вызове. То есть список items сохраняется между вызовами функции. ↔️Что происходит по шагам: 🎯 Первый вызов: add_item("apple") В список добавляется "apple": ['apple'] 🎯 Второй вызов: add_item("banana") Используется тот

Новый пост Y_LAB Actual | Код под микроскопом 🔍

Продолжаем разбирать фрагменты кода, в которых всё выглядит правильно до тех пор, пока программа не начинает работать не так, как ожидалось.

Сегодня под микроскопом небольшой пример на 📱 Python, который регулярно становится причиной багов даже у опытных разработчиков

def add_item(item, items=[]):

items.append(item)

return items

print(add_item("apple"))

print(add_item("banana"))

Вопрос:

Что выведет программа?

Многие ожидают такой результат:

['apple']

['banana']

Но на самом деле вывод будет другим:

['apple']

['apple', 'banana']

Почему так происходит 💬

На первый взгляд кажется, что при каждом вызове функции создаётся новый пустой список:

items=[]

Но в Python аргументы по умолчанию создаются один раз, в момент объявления функции, а не при каждом её вызове.

То есть список items сохраняется между вызовами функции.

↔️Что происходит по шагам:

🎯 Первый вызов:

add_item("apple")

В список добавляется "apple":

['apple']

🎯 Второй вызов:

add_item("banana")

Используется тот же самый список, поэтому результат становится:

['apple', 'banana']

Как исправить 🛠

Обычно используют None в качестве значения по умолчанию:

def add_item(item, items=None):

if items is None:

items = []

items.append(item)

return items

Теперь при каждом вызове будет создаваться новый список.

💬💬💬

Такая особенность Python может долго оставаться незаметной: функция работает, ошибок нет, но данные начинают «переезжать» между вызовами.

Именно поэтому изменяемые объекты в аргументах по умолчанию считаются одним из самых известных антипаттернов языка.

А вы знали про эту особенность Python или ожидали другой результат? 👀

#Y_LAB_University #Y_LAB_Actual