def add_numbers(a, b=[]):
b.append(a)
return sum(b)
print(add_numbers(1))
print(add_numbers(2, [3]))
add_numbers(1)
вернет 1
. В качестве значения по умолчанию для аргумента `b` используется пустой список, который изменяется при каждом вызове функции.add_numbers(2, [3])
вернет 5
. Аргумент `b` передается явно как [3]
, затем к нему добавляется 2
, и вычисляется сумма.
1
5
Разбор задачи:
Эта задача проверяет понимание работы значений аргументов по умолчанию в Python, особенно когда в качестве значения по умолчанию используется изменяемый объект (в данном случае, список).
Первый вызов: print(add_numbers(1))
add_numbers
вызывается с аргументом a = 1
и аргументом b
, для которого используется значение по умолчанию []
.b.append(a)
добавляет 1
в список b
. Теперь b
равно [1]
.sum(b)
возвращает сумму элементов списка b
, то есть 1
.1
, и он выводится в консоль.Второй вызов: print(add_numbers(2, [3]))
add_numbers
вызывается с аргументом a = 2
и аргументом b = [3]
. Важно: теперь используется список, который передали явно, а не список по умолчанию.b.append(a)
добавляет 2
в список b
. Теперь b
равно [3, 2]
.sum(b)
возвращает сумму элементов списка b
, то есть 3 + 2 = 5
.5
, и он выводится в консоль.Вывод в консоль:
1
5
Важный нюанс:
Если бы мы вызывали функцию add_numbers
несколько раз, используя только значение по умолчанию для b
, то список b
продолжал бы расти от вызова к вызову. Например, следующий код:
def add_numbers(a, b=[]):
b.append(a)
return sum(b)
print(add_numbers(1))
print(add_numbers(2)) # b будет [1, 2]
print(add_numbers(3)) # b будет [1, 2, 3]
Вывел бы:
1
3
6
Рекомендации по исправлению (если цель - каждый раз начинать с пустого списка по умолчанию):
def add_numbers(a, b=None):
if b is None:
b = []
b.append(a)
return sum(b)
print(add_numbers(1))
print(add_numbers(2))
print(add_numbers(3))
В этом случае вывод был бы:
1
2
3