Что выведет этот код?


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]
  
0