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, а именно то, что аргументы по умолчанию вычисляются только один раз, когда функция определена. Это означает, что если аргумент по умолчанию является изменяемым объектом (таким как список), то этот объект будет использоваться совместно всеми вызовами функции, которые не передают свой собственный аргумент для этого параметра.
func
определена с аргументом a
и аргументом по умолчанию b
, который является списком [10]
.func(5)
, аргумент a
равен 5.b.append(a)
добавляет 5 в список b
. Теперь b
равен [10, 5]
.b
.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]