None как значение по умолчанию, особенно для изменяемых типов данных (списки, словари), чтобы избежать проблем с тем, что значение по умолчанию будет создано только один раз и использоваться повторно при каждом вызове функции. Внутри функции нужно проверять, было ли передано значение, используя is None.
Да, передавать None как значение по умолчанию для аргумента функции в Python — это абсолютно нормальная и часто используемая практика. Более того, во многих случаях это даже рекомендуемый способ.
Вот почему это полезно и как это работает:
None в качестве значения по умолчанию позволяет отличать случай, когда аргумент явно не был передан, от случая, когда передано какое-либо другое "пустое" или "нулевое" значение (например, пустая строка "", ноль 0, пустой список [], False).None же является иммутабельным, поэтому эта проблема не возникает.
def my_function(arg=None):
if arg is None:
arg = [] # Или какое-то другое значение по умолчанию, рассчитанное на основе logic
arg.append("элемент")
return arg
print(my_function()) # Вывод: ['элемент']
print(my_function([1, 2])) # Вывод: [1, 2, 'элемент']
print(my_function()) # Вывод: ['элемент']
В этом примере, если arg не передан, он инициализируется новым списком. Если бы мы напрямую написали def my_function(arg=[]), то все вызовы my_function() без аргументов добавляли бы элементы в один и тот же список, что почти наверняка является ошибкой.is None для проверки, был ли аргумент действительно опущен. Никогда не используйте == None, так как это может привести к неожиданным результатам, если объект переопределяет оператор ==.В заключение, передача None как значения по умолчанию — это хороший и безопасный способ обработки необязательных аргументов в Python, особенно когда вам нужно различать отсутствие значения и "пустое" значение, и когда вы хотите избежать проблем с мутабельными значениями по умолчанию.