В этом коде используется изменяемый объект по умолчанию — список items=[], который сохраняется между вызовами функции.
def function(test_list: list = []):
В этом коде используется изменяемый объект по умолчанию — список items=[], который сохраняется между вызовами функции.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
def function(test_list: list = []): test_list.append(1) print(test_list)
test_list = [] function() function(test_list) function() print(test_list)
Ответ
В этом коде используется изменяемый объект по умолчанию — список items=[], который сохраняется между вызовами функции.
Разберём вызовы:
def f(item, items=[]):
items.append(item)
return items
print(f(1)) # [1]
print(f(1, [])) # [1]
print(f(1)) # [1, 1]
f(1)— параметрitemsне передан, используется дефолтный список. В него добавляется1, возвращается[1].f(1, [])— передан новый пустой список, в него добавляется1, возвращается[1].f(1)— снова вызывается без параметра, используется тот же дефолтный список, в который уже был добавлен1в первом вызове. Теперь добавляется ещё один1, возвращается[1, 1].
Это классическая «ловушка» с изменяемыми значениями по умолчанию в Python. Чтобы избежать такого поведения, лучше использовать None и создавать новый список внутри функции:
def f(item, items=None):
if items is None:
items = []
items.append(item)
return items