Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Ссылки Python: Списки

Пока вы работали с неизменяемыми значениями, способ, с помощью которого в Python эти значения передаются в функции и сохраняются в переменных, не был столь интересен. Но теперь вы учитесь работать с изменяемыми объектами, а значит настало время узнать, что в Python всё передаётся по ссылке. Что же такое ссылка? Разберёмся. Но начнём знакомство со старших братьев ссылки — адреса и указателя.

Все данные, с которыми работает программа, находятся в оперативной памяти компьютера. Чтобы иметь доступ к некоторому участку памяти, нужно знать адрес этого участка.

В языках с ручным управлением памятью (C, C++ и другие) необходимо постоянно следить за тем, что память по адресу выделена и ещё не освобождена: в таких языках программист явно запрашивает у операционной системы нужное ему количество памяти. ОС в ответ на запрос выделяет участок в общей оперативной памяти, закрепляет этот блок за попросившим доступ и возвращает указатель, по сути представляющий собой тот самый адрес. Получив указатель, программист может сохранить что-то в выделенную память. По окончании работы выделенные участки нужно освобождать — сообщать ОС, что память свободна и может быть использована для чего-то другого. Если обратиться по указателю к участку памяти, который ещё не выделен или уже освобождён, программа завершится с ошибкой!

Python является языком с автоматическим управлением памятью. Как только программисту требуется создать некое значение, требуемое количество памяти выделяется средой исполнения (runtime) автоматически, значение сохраняется в эту память и программисту возвращается ссылка на сохранённое значение. А как только данные перестают использоваться, память будет освобождена — также автоматически. Таким образом ссылки выполняют ту же роль, что и указатели в упомянутых выше языках. Но пользоваться ссылками всегда безопасно: ссылка не может указывать на память, не готовую к использованию. Более того, программисту на Python не нужно отдельно получать память и отдельно заполнять её — данные размещаются в памяти всё той же средой исполнения.

Итак, мы знаем, что когда мы создаём некое значение, мы получаем от runtime именно ссылку на него. Ссылок на одно и то же значение в любой момент времени может быть сколько угодно. Python экономит усилия и всегда и везде передаёт любые значения по ссылкам — создаёт новые ссылки на существующие данные. Даже переменные — это всего лишь имена, привязанные к ссылкам. И при вызове функции с передачей ей аргументов, передаются не сами значения, а только ссылки на них — по одной новой ссылке на каждое значение. Когда же выполнение функции завершится, ненужные ссылки уничтожаются. И как только исчезает последняя ссылка на некое значение, среда исполнения понимает, что и само значение больше никому не нужно и его можно удалить из памяти (освободив таким образом место). Этим занимается специальный механизм среды исполнения, так называемый счётчик ссылок (reference counter).

Использование подсчёта ссылок позволяет Python экономить изрядное количество памяти при передаче между разными частями программы длинных строк или больших чисел: не нужно копировать данные с места на место, как это делается в некоторых других языках. Но есть и обратная сторона медали. Передавая некоторому коду ссылку на изменяемый объект, мы не можем запретить этому коду изменить объект в процессе выполнения. Это в некоторых случаях затрудняет отладку кода и усложняет его чтение. Об этой особенности Python всегда нужно помнить.

В следующем уроке вы увидите, как передача ссылок может себя проявлять неожиданным для новичка образом.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
1 июня 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»