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]