Пока вы работали с неизменяемыми значениями, способ, с помощью которого в Python эти значения передаются в функции и сохраняются в переменных, не был столь интересен. Но теперь вы учитесь работать с изменяемыми объектами, а значит настало время узнать, что в Python всё передаётся по ссылке. Что же такое ссылка? Разберёмся. Но начнём знакомство со старших братьев ссылки — адреса и указателя.
Все данные, с которыми работает программа, находятся в оперативной памяти компьютера. Чтобы иметь доступ к некоторому участку памяти, нужно знать адрес этого участка.
В языках с ручным управлением памятью (C, C++ и другие) необходимо постоянно следить за тем, что память по адресу выделена и ещё не освобождена: в таких языках программист явно запрашивает у операционной системы нужное ему количество памяти. ОС в ответ на запрос выделяет участок в общей оперативной памяти, закрепляет этот блок за попросившим доступ и возвращает указатель, по сути представляющий собой тот самый адрес. Получив указатель, программист может сохранить что-то в выделенную память. По окончании работы выделенные участки нужно освобождать — сообщать ОС, что память свободна и может быть использована для чего-то другого. Если обратиться по указателю к участку памяти, который ещё не выделен или уже освобождён, программа завершится с ошибкой!
Python является языком с автоматическим управлением памятью. Как только программисту требуется создать некое значение, требуемое количество памяти выделяется средой исполнения (runtime) автоматически, значение сохраняется в эту память и программисту возвращается ссылка на сохранённое значение. А как только данные перестают использоваться, память будет освобождена — также автоматически. Таким образом ссылки выполняют ту же роль, что и указатели в упомянутых выше языках. Но пользоваться ссылками всегда безопасно: ссылка не может указывать на память, не готовую к использованию. Более того, программисту на Python не нужно отдельно получать память и отдельно заполнять её — данные размещаются в памяти всё той же средой исполнения.
Итак, мы знаем, что когда мы создаём некое значение, мы получаем от runtime именно ссылку на него. Ссылок на одно и то же значение в любой момент времени может быть сколько угодно. Python экономит усилия и всегда и везде передаёт любые значения по ссылкам — создаёт новые ссылки на существующие данные. Даже переменные — это всего лишь имена, привязанные к ссылкам. И при вызове функции с передачей ей аргументов, передаются не сами значения, а только ссылки на них — по одной новой ссылке на каждое значение. Когда же выполнение функции завершится, ненужные ссылки уничтожаются. И как только исчезает последняя ссылка на некое значение, среда исполнения понимает, что и само значение больше никому не нужно и его можно удалить из памяти (освободив таким образом место). Этим занимается специальный механизм среды исполнения, так называемый счётчик ссылок (reference counter).
Использование подсчёта ссылок позволяет Python экономить изрядное количество памяти при передаче между разными частями программы длинных строк или больших чисел: не нужно копировать данные с места на место, как это делается в некоторых других языках. Но есть и обратная сторона медали. Передавая некоторому коду ссылку на изменяемый объект, мы не можем запретить этому коду изменить объект в процессе выполнения. Это в некоторых случаях затрудняет отладку кода и усложняет его чтение. Об этой особенности Python всегда нужно помнить.
В следующем уроке вы увидите, как передача ссылок может себя проявлять неожиданным для новичка образом.
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Статья «Ловушки обучения»
Вебинар «Как самостоятельно учиться»
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт