def update(x=[]):
x.append(1)
return x
print(update())
print(update())
Результат выполнения кода:
[1]
[1, 1]
Пояснение: Аргумент x=[] является изменяемым объектом (списком), который инициализируется только один раз при определении функции. При первом вызове update(), в этот список добавляется 1. При последующих вызовах, функция использует тот же самый список, а не создает новый.
Вопрос: Что выведет следующий код и почему?
def update(x=[]):
x.append(1)
return x
print(update())
print(update())
Ответ:
Код выведет:
[1]
[1, 1]
Объяснение:
Проблема кроется в значении по умолчанию для аргумента x функции update. В Python значения по умолчанию для аргументов функций создаются только один раз, когда функция определяется. Это означает, что список [] создается один раз и переиспользуется при каждом вызове функции, если не передать другой список в качестве аргумента.
Шаг 1:
При первом вызове update() без аргументов, функция использует список по умолчанию []. К этому списку добавляется число 1. Функция возвращает список [1], который и выводится.
Шаг 2:
При втором вызове update(), тот же самый список, который использовался в первом вызове (и который теперь содержит [1]), снова используется. К этому списку добавляется еще одно число 1. Функция возвращает список [1, 1], который и выводится.
Как избежать этой проблемы:
Чтобы избежать этой проблемы, рекомендуется использовать None в качестве значения по умолчанию и создавать список внутри функции, если аргумент x не был передан:
def update(x=None):
if x is None:
x = []
x.append(1)
return x
print(update())
print(update())
В этом исправленном варианте при каждом вызове update() без аргументов будет создаваться новый пустой список, и вывод будет:
[1]
[1]