Sobes.tech
Middle
95
questionbank

Почему использование изменяемых объектов в качестве параметров по умолчанию является плохой практикой? Приведите пример неудачного случая и опишите, как можно это исправить.

Ответ от нейросети

sobes.tech AI

Использование изменяемых объектов (списков, словарей, множеств) в качестве параметров по умолчанию приводит к тому, что значение по умолчанию создается один раз при определении функции. При каждом вызове функции без явного указания значения этого параметра, будет использоваться тот же экземпляр объекта. Последующие изменения этого объекта в одном вызове функции будут сохраняться и влиять на следующие вызовы.

Пример неудачного случая:

# Плохая практика: список как параметр по умолчанию
def add_item_bad(item, data=[]):
  data.append(item)
  return data
# Результат первого вызова
result1 = add_item_bad("apple")
print(result1)
# Результат второго вызова - список сохранился
result2 = add_item_bad("banana")
print(result2)
# Ожидали ["cherry"], но получили ["apple", "banana", "cherry"]
result3 = add_item_bad("cherry")
print(result3)

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

Использовать неизменяемый объект (обычно None) в качестве значения по умолчанию и инициализировать изменяемый объект внутри функции, если параметр не был передан.

# Хорошая практика: None как параметр по умолчанию
def add_item_good(item, data=None):
  if data is None:
    data = []  # Инициализация нового списка при необходимости
  data.append(item)
  return data
# Результат первого вызова
result1_good = add_item_good("apple")
print(result1_good)
# Результат второго вызова - новый список
result2_good = add_item_good("banana")
print(result2_good)
# Ожидаемый результат ["cherry"]
result3_good = add_item_good("cherry")
print(result3_good)