Как использовать и учитывать аргументы по умолчанию в функциях Python

Бизнес

Установка аргумента по умолчанию в определении функции Python приводит к тому, что значение по умолчанию будет использоваться, если аргумент опущен во время вызова функции.

Ниже приводится подробное описание.

  • Установка аргументов по умолчанию
  • Ограничения на положение аргументов по умолчанию
  • Обратите внимание, что когда список или словарь используется в качестве значения по умолчанию

Установка аргументов по умолчанию

Если в определении функции имя аргумента = значение по умолчанию, то при опущении соответствующего аргумента будет использоваться значение по умолчанию.

def func_default(arg1, arg2='default_x', arg3='default_y'):
    print(arg1)
    print(arg2)
    print(arg3)

func_default('a')
# a
# default_x
# default_y

func_default('a', 'b')
# a
# b
# default_y

func_default('a', arg3='c')
# a
# default_x
# c

Ограничения на положение аргументов по умолчанию

Размещение аргумента по умолчанию перед обычным аргументом (аргумент, для которого не указано значение по умолчанию) при определении функции приводит к ошибке.
SyntaxError

# def func_default_error(arg2='default_a', arg3='default_b', arg1):
#     print(arg1)
#     print(arg2)

# SyntaxError: non-default argument follows default argument

Обратите внимание, что когда список или словарь используется в качестве значения по умолчанию

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

Значения аргументов по умолчанию оцениваются слева направо при выполнении определения функции. Это означает, что выражение аргумента по умолчанию оценивается только один раз при определении функции, и для каждого вызова используется одно и то же «вычисленное» значение.
8.7. Function definitions — Python 3.10.2 Documentation

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

Пример для листинга.

def func_default_list(l=[0, 1, 2], v=3):
    l.append(v)
    print(l)

func_default_list([0, 0, 0], 100)
# [0, 0, 0, 100]

func_default_list()
# [0, 1, 2, 3]

func_default_list()
# [0, 1, 2, 3, 3]

func_default_list()
# [0, 1, 2, 3, 3, 3]

Пример для словаря.

def func_default_dict(d={'default': 0}, k='new', v=100):
    d[k] = v
    print(d)

func_default_dict()
# {'default': 0, 'new': 100}

func_default_dict(k='new2', v=200)
# {'default': 0, 'new': 100, 'new2': 200}

При каждом вызове функции создается новый объект.

def func_default_list_none(l=None, v=3):
    if l is None:
        l = [0, 1, 2]
    l.append(v)
    print(l)

func_default_list_none()
# [0, 1, 2, 3]

func_default_list_none()
# [0, 1, 2, 3]
Copied title and URL