Вы меня удивляете, сударь.
Вроде не новичок и понимаете концепию иммутаельности, передачи аргументов по значению и по ссылке, но с непониманием элементарной базовой особенности языка вы идёте задавать тривиальный вопрос у живых людей, когда самые-самые новички знакомятся с этим в первых главах любой книжки про питон для чайников.
К питону не применимы понятия "передачи аргументов по значению" или "по ссылке".
В Питоне переменные раотают иначе, чем в Си или Паскале.
Переменная в Си - это ящичек, куда вы что-то можете положить. В том числе в ящичке может лежать ссылка на другой ящичек.
В питоне переменная больше похожа на ярлычок, привязанный к объекту. Число, строка, список, словарь, класс, инстанс класса, None, ... - всё это объекты и они лежат где-то в памяти.
Какие-то объекты мутабельны, какие-то иммутаельны, но это не важно. У любого объекта может быть много ярлычков (например имен). Также ярлычком будет элемент списка, ключ или значение в словаре и т.д.
От обычного указателя в си это отличается тем, что его не нужно разыменовывать, чтобы обратиться к объекту. Употребляем имя - подразумеваем значение. Присвоение перевешивает ярлычок, удаление удаляет ярллычок.
Да, чем-то это смахивает на смартпоинтеры, но не полностью.
Да, в питоне не принято изменять мутабельные входные параметры. По крайней мере можно яно скопировать мутабельный объект поверхностно или глубоко. Для этого есть специальные методы или функция copy.
Ох и предстоит вам еще поудивляться побочному эффекту мутабельности в дефолтных значениях аргументов функций.
Подавите свои амбиции и прочитайте хотя бы бегло какую-нибуь книжку по питону. Вам можно даже не шибко детскую.