Что выведет этот код?


def func(a, b=[10]):
    b.append(a)
    return b

print(func(5))

Результат выполнения кода: [10, 5]. Значение списка b по умолчанию инициализируется только один раз при определении функции. При каждом вызове func происходит модификация этого списка.

Вопрос: Что выведет следующий код?


def func(a, b=[10]):
    b.append(a)
    return b
print(func(5))
  

Объяснение:

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

  1. Функция func определена с аргументом a и аргументом по умолчанию b, который является списком [10].
  2. При первом вызове func(5), аргумент a равен 5.
  3. Внутри функции, b.append(a) добавляет 5 в список b. Теперь b равен [10, 5].
  4. Функция возвращает b.
  5. print выводит возвращенное значение.

Вывод:

[10, 5]

Важное замечание: Если бы функция была вызвана снова, без предоставления аргумента для b, то она бы использовала тот же список [10, 5], который остался от предыдущего вызова. Например, func(6) в следующий раз вывело бы [10, 5, 6].

Рекомендации: Чтобы избежать этой проблемы, если предполагается, что b должно быть новым списком при каждом вызове функции, следует использовать b=None в качестве значения по умолчанию, а затем создавать новый список внутри функции, если b является None.


def func_fixed(a, b=None):
    if b is None:
        b = [10]
    b.append(a)
    return b

print(func_fixed(5)) # Выводит [10, 5]
print(func_fixed(6)) # Выводит [10, 6]
  
0