Python: список по умолчанию в функции

Из программирования Саммерфилда в Python3:

он говорит следующее: когда заданы значения по умолчанию, они создаются во время выполнения оператора def, а не при вызове функции. Но мой вопрос для следующего примера:

def append_if_even(x, lst =None):
    lst = [] if lst is None else lst
    if x % 2 ==0:
        lst.append(x)
    return lst

Когда выполняется первое определение, lst указывает на None, но после вызова функции append_if_even(2),

  • Не следует ли указывать на [2], поскольку после lst.append(x) больше не указывать на None?

  • Почему при следующем выполнении все равно ничего не указывается?

  • Что на самом деле происходит внутри этого вызова функции append_if_even(2)?

1 ответ

Решение

Не следует ли указывать на [2], поскольку после lst.append(x) больше не указывать на None? Почему при следующем выполнении все равно ничего не указывается?

Это именно то, что вы предотвращаете с помощью lst=None, lst = [] if lst is None else lst строительство. Хотя аргументы по умолчанию для функции оцениваются только один раз во время компиляции, код внутри функции оценивается каждый раз, когда функция выполняется. Поэтому каждый раз, когда вы выполняете функцию, не передавая значение для lst, он начнется со значения по умолчанию None и затем сразу же заменяется новым пустым списком при выполнении первой строки функции.

Если бы вы вместо этого определяли функцию следующим образом:

def append_if_even(x, lst=[]):
    if x % 2 ==0:
        lst.append(x)
    return lst

Тогда это будет действовать так, как вы описываете. Значение по умолчанию для lst будет одним и тем же списком (изначально пустым) для каждого запуска функции, и каждое четное число, переданное функции, будет добавлено в один растущий список.

Для получения дополнительной информации см. "Наименьшее изумление" и изменяемый аргумент по умолчанию.

Другие вопросы по тегам