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


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))

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

Второй вызов: print(add_numbers(2, [3]))

  1. Функция add_numbers вызывается с аргументом a = 2 и аргументом b = [3]. Важно: теперь используется список, который передали явно, а не список по умолчанию.
  2. Внутри функции, b.append(a) добавляет 2 в список b. Теперь b равно [3, 2].
  3. sum(b) возвращает сумму элементов списка b, то есть 3 + 2 = 5.
  4. Функция возвращает 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
0