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]