Sobes.tech
Middle
155

Neden değiştirilebilir nesneleri varsayılan parametre olarak kullanmak kötü bir uygulamadır? Başarısız bir örnek verin ve nasıl düzeltileceğini açıklayın.

AI'dan gelen yanıt

sobes.tech yapay zeka

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

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

# Плохая практика: список как параметр по умолчанию
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)