None
в качестве значения по умолчанию и создавать изменяемый объект внутри функции.def func(a=1, b)
недопустимо. Аргументы со значениями по умолчанию должны идти в конце списка аргументов.Существуют несколько важных ограничений, которые необходимо учитывать при использовании аргументов со значениями по умолчанию в Python:
def append_to_list(value, my_list=[]): # ОПАСНО! Список является изменяемым.
my_list.append(value)
return my_list
print(append_to_list(1)) # [1]
print(append_to_list(2)) # [1, 2] - Неожиданно!
print(append_to_list(3)) # [1, 2, 3] - Неожиданно!
# Правильное решение:
def append_to_list_correct(value, my_list=None):
if my_list is None:
my_list = []
my_list.append(value)
return my_list
print(append_to_list_correct(1)) # [1]
print(append_to_list_correct(2)) # [2]
print(append_to_list_correct(3)) # [3]
def my_function(a=1, b): # SyntaxError: non-default argument follows default argument
print(a, b)
Пример (правильно):
def my_function(b, a=1):
print(a, b)
my_function(2) # 1 2
my_function(2, a=3) # 3 2
В целом, понимание этих ограничений и особенностей позволяет писать более надежный и предсказуемый код на Python.