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, особенно когда вам нужно различать отсутствие значения и "пустое" значение, и когда вы хотите избежать проблем с мутабельными значениями по умолчанию.