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


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

print(complex_func(1))
print(complex_func(2))

Результат работы кода:
[1]
[1, 2]
Объяснение:
Функция complex_func использует изменяемый объект (список) в качестве значения по умолчанию для параметра b. Из-за этого, при первом вызове функции без указания b, создается список [ ] и a (равное 1) добавляется в этот список. Этот список сохраняется между вызовами. При втором вызове функции без указания b, используется тот же самый список, к которому добавляется a (равное 2), поэтому результат - [1, 2]. Чтобы избежать этого поведения, рекомендуется использовать b=None в качестве значения по умолчанию и создавать новый список внутри функции, если b is None.

Вопрос: Что выведет этот код, и почему?


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

print(complex_func(1))
print(complex_func(2))
  

Ответ:

Этот код выведет следующее:


[1]
[1, 2]
  

Объяснение:

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

В первом вызове complex_func(1) аргумент b не передан, поэтому используется значение по умолчанию None. Внутри функции b инициализируется как пустой список [], к которому добавляется значение a (равное 1). Функция возвращает список [1].

Во втором вызове complex_func(2), опять же, аргумент b не передан, и поэтому используется значение по умолчанию, но важно помнить, что значение по умолчанию - это тот же самый список, который был создан при первом вызове. То есть, b уже содержит [1]. Затем к этому списку добавляется значение a (равное 2), и функция возвращает список [1, 2].

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


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

print(complex_func(1))
print(complex_func(2))
  

И вот как это можно исправить:


def complex_func(a, b=None):
    if b is None:
        b = [] #  или b = list()
    b.append(a)
    return b

print(complex_func(1))
print(complex_func(2))
  

И если бы мы исправили функцию вот так, то вывод был бы:


[1]
[2]
  
0