В Python переменные передаются по ссылке на объект. При этом значение переменной по сути является ссылкой на объект в памяти.
Когда мы присваиваем одну переменную другой, мы создаем новую ссылку на тот же объект. Изменение изменяемого объекта через одну ссылку будет видно через другую.
Пример с изменяемым объектом (список):
python
Если мы переприсвоим переменную, то она начнет ссылаться на новый объект.
Пример с переприсваиванием:
python
Для неизменяемых объектов (строки, числа, кортежи) изменение значения переменной всегда приводит к созданию нового объекта и переприсваиванию ссылки. Это создает впечатление передачи по значению, хотя на самом деле это все еще передача ссылки на новый объект.
Пример с неизменяемым объектом (число):
python
Таким образом, Python использует модель "передачи ссылки на объект", которая при работе с изменяемыми объектами ведет себя как передача по ссылке, а при работе с неизменяемыми объектами - как передача по значению (из-за создания новых объектов при "изменении").