Олег Марков
Передача аргументов по ссылке и по значению в Python
Введение
Понимание того, как Python передаёт аргументы в функции, критично для правильного управления объектами и предотвращения ошибок. В отличие от некоторых языков, Python использует модель передачи «по объектной ссылке», которая иногда ошибочно интерпретируется как передача по значению или по ссылке.
В этой статье мы подробно разберём, как изменяемые и неизменяемые объекты ведут себя при передаче в функции, с практическими примерами и объяснением внутренних механизмов.
Если вы хотите детально изучить работу с объектами и аргументами в Python, приходите на наш курс Основы Python. На курсе 209 уроков и 34 упражнения, AI-тренажеры для практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Механизм передачи аргументов
В Python каждый объект имеет ссылку в памяти. Когда объект передается в функцию, передаётся ссылка на объект, а не сам объект:
def modify(obj):
obj += [4]
return obj
lst = [1, 2, 3]
new_lst = modify(lst)
print(lst) # [1, 2, 3] - исходный объект не изменился
print(new_lst) # [1, 2, 3, 4] - возвращен новый объектМодель называется «pass-by-object-reference» или «pass-by-assignment».
Изменяемые объекты
Списки, словари, множества — изменяемые объекты. Если функция изменяет их через методы, изменения сохраняются:
def append_item(lst):
lst.append(4)
numbers = [1, 2, 3]
append_item(numbers)
print(numbers) # [1, 2, 3, 4]Неизменяемые объекты
Строки, кортежи, числа — неизменяемые. Любая операция создает новый объект:
def add_one(n):
n += 1
return n
x = 5
y = add_one(x)
print(x) # 5
print(y) # 6Изменение аргумента внутри функции не влияет на исходный объект.
Практические примеры
- Списки как аргументы: удобно изменять на месте при обработке больших данных.
- Числа и строки: безопасно передавать, изменения внутри функции не влияют на внешнюю переменную.
- Словари: можно использовать для накопления данных без возврата нового объекта.
Частые ошибки
- Ожидание, что неизменяемый объект изменится внутри функции.
- Изменение изменяемого объекта в разных местах кода, вызывающее непредсказуемые результаты.
- Игнорирование возвращаемых значений для неизменяемых объектов.
Часто задаваемые вопросы
Python передает аргументы по ссылке или по значению? Python передаёт ссылки на объекты, но модель работы зависит от изменяемости объекта.
Как избежать изменений изменяемого объекта? Передавайте копию объекта:
import copy
my_copy = copy.deepcopy(my_list)- Можно ли вернуть несколько значений и избежать изменения исходных объектов? Да, возвращайте кортежи или новые объекты после вычислений.
Заключение
Передача аргументов в Python строится на ссылках на объекты, что создаёт особое поведение для изменяемых и неизменяемых типов. Понимание этих механизмов помогает писать предсказуемый и безопасный код, избегать ошибок при работе с функциями и коллекциями.
Для системного изучения передачи аргументов и поведения объектов в Python рекомендую пройти курс Основы Python. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Python прямо сегодня.
Постройте личный план изучения Python до уровня Middle — бесплатно!
Python — часть карты развития Backend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Все гайды по Python
Лучшие курсы по теме

Основы Python
Антон Ларичев
Nest.js с нуля
Антон Ларичев