def foo(x, y=None):
if y is None:
y = []
y.append(x)
return y
print(foo(1))
print(foo(2, [3]))
[1]
[3, 2]
Функция foo(x, y=None)
принимает два аргумента: x
и y
. y
имеет значение по умолчанию None
.
Внутри функции происходит следующее:
y
равным None
.y
равно None
, то y
инициализируется как пустой список ([]
). Это ключевой момент, который создает "ловушку". Важно понимать, что этот список создается только один раз, при определении функции, и используется при каждом вызове foo
с дефолтным значением y=None
.x
добавляется в список y
.y
.Первый вызов: print(foo(1))
y
равно None
, поэтому y
инициализируется как []
.1
добавляется в y
.y
теперь равно [1]
.[1]
.Второй вызов: print(foo(2, [3]))
y
равно [3]
(т.к. было передано явное значение).2
добавляется в y
.y
теперь равно [3, 2]
.[3, 2]
.Таким образом, результат выполнения кода будет:
[1]
[3, 2]
Этот вопрос проверяет понимание изменяемых аргументов по умолчанию в Python. Неправильное использование аргументов по умолчанию, особенно изменяемых (списки, словари), может привести к неожиданному поведению программы. Интервьюер хочет убедиться, что кандидат осознает эту особенность языка и умеет ее избегать.