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]