В Python мы часто думаем о переменной как о метке для значения. Однако, если говорить точнее, то переменная на самом деле указывает на объект, который хранит значение. В Python мы можем рассматривать объект как блок памяти, который хранит определенное значение и позволяет нам выполнять соответствующие действия с ним.  В Python все является объектом. Когда мы работаем с объектами, то используем имена и ссылки, а не традиционные переменные, как в некоторых других языках.  Каждое имя - просто метка для объекта. У объекта может быть несколько имен.  Ссылка - это связь между именем и объектом. Имя, которое мы используем для обращения к объекту, на самом деле является ссылкой на этот объект.  Итак, объект в Python может иметь несколько имен (ссылок). Все они будут указывать на один и тот же объект в памяти. Каждый объект в Python содержит в себе три элемента тип (type), подсчет ссылок (reference count) и значение (value).   Далее, в приведенном ниже примере, переменной num присваивается значение 10 num = 10 Python создает новый объект целого числа типа int (который подобен цифровому представлению целого числа). Переменная num ссылается на этот адрес памяти. Чтобы найти адрес памяти объекта, на который ссылается переменная, можно воспользоваться встроенной функцией id(). Функция id() возвращает адрес памяти в виде числа в десятичной системе. Мы можем преобразовать его в шестнадцатеричную с помощью встроенной функции hex(). В Python, в отличие от других языков, не существует понятий передачи по значению или передачи по ссылке. Вместо этого в Python используется концепция передачи по присваиванию или передачи по ссылке на объект. Когда функция вызывается с аргументом, создается новая ссылка на объект и присваивается параметру переменной в функции. Это означает, что параметр переменной действует как ссылка на тот же объект в памяти, что и исходный аргумент, а не как его копия. Поскольку параметр переменной внутри функции ссылается на тот же объект, что и исходный аргумент, любые изменения, внесенные в объект внутри функции, также повлияют на исходный объект за пределами функции. При передаче аргумента в функцию Python на самом деле  передается значение ссылки (адрес памяти), а не значение самого объекта. Поэтому изменения в объекте внутри функции влияют на исходный объект. Пример: Неизменяемый (иммутабельный) параметр  К неизменяемым относятся объекты встроенных типов: int (целые числа), float (числа с плавающей точкой), complex (комплексные числа), bool (логические значения), strings (строки), bytes (последовательности отдельных байтов) и tuple (кортежи). Вывод: В приведенном выше примере и name, и new_name одновременно указывают на Mary. Но когда name = 'John', воссоздается новый объект со значением John, и name продолжает указывать на него, а new_name по-прежнему указывает на Mary. Следовательно, значение new_name не изменяется. Пример: Изменяемый (мутабельный) параметр В Python к изменяемым относятся объекты встроенных типов: list (список), dict (словарь) и set (множество).  Вывод: В приведенном примере, поскольку students является списком, если вы измените значение students, это приведет к изменению значений всех переменных, которые на него ссылаются. Таким образом, students становится . Под сборкой мусора в Python понимается автоматический процесс освобождения памяти, занимаемой объектами, которые больше не используются. Это механизм, который управляет выделением и освобождением памяти в Python. Python использует сборщик мусора для автоматического обнаружения и удаления объектов, на которые больше нет ссылок или которые не доступны программе. Когда объект больше не нужен, сборщик мусора распознает его как "мусор" и освобождает память, занимаемую этим объектом. Существует две основные стратегии сборки мусора: подсчет ссылок сборка мусора на основе поколений   Этот метод отслеживает количество ссылок, указывающих на каждый объект. Когда счетчик ссылок для объекта достигает нуля, что означает их отсутствие, объект считается “мусором” (ненужным), и память освобождается. Чтобы получить количество ссылок на объект, вы можете воспользоваться встроенным модулем ctypes.  Но подсчет ссылок не может решить проблему циклической ссылки. Циклическая ссылка, также известная как цикл ссылок или круговая ссылка, возникает в Python, когда группа объектов ссылается друг на друга таким образом, что образуется замкнутый цикл, препятствующий сборке мусора. Это может привести к утечке памяти, так как объекты, на которые ссылаются, не подлежат автоматическому освобождению памяти, поскольку количество их ссылок никогда не достигает нуля. Базовый пример циклической ссылки: В приведенном примере переменная “x” ссылается сама на себя. Такая ситуация называется циклической ссылкой. Это создает проблему, которую традиционные методы сборки мусора не могут решить. Для ее решения Python использует сборку мусора на основе поколений. Сборка мусора на основе трассировки - это техника, используемая в некоторых алгоритмах сборки мусора для выявления и удаления недостижимых объектов. Она работает путем отслеживания выполнения программы и выявления активных объектов на основе их доступности из корневых ссылок. Generational Garbage Collection разделяет объекты на поколения в зависимости от их возраста, исходя из того, что большинство объектов становятся мусором относительно быстро после создания. Основная идея поколенческой сборки мусора заключается в том, что молодые объекты скорее всего станут мусором раньше старых. Сборщик мусора в Python сосредотачивает свои усилия на молодых поколениях, часто начиная сборку мусора именно с них. Старые объекты проверяются реже, потому что они меньше подвержены становлению мусором. Поколенческая сборка мусора помогает решить проблему циклических ссылок, периодически проверяя объекты в разных поколениях и удаляя те из них, которые больше не достижимы. Она обнаруживает и прерывает циклические ссылки, выявляя недостижимые объекты через процесс, известный как "mark and sweep" (“пометка и уборка”). Таким образом, сборка мусора на основе поколений обеспечивает: отсутствие утечек памяти; правильное использование системных ресурсов; эффективную сборку мусора. В приведенном ниже примере мы создаем два класса “Students” и “Boys”, ссылающихся друг на друга, и выполняем сборку мусора с помощью встроенного модуля gc (интерфейс сборщика мусора). Никогда не следует отключать сборщик мусора, если это не требуется. Вывод: Сборка мусора в Python подобна полезному помощнику, который эффективно очищает память, предотвращая ее утечки и автоматически освобождая ресурсы. Это позволяет разработчикам сосредоточиться на непосредственном написании кода, не беспокоясь об управлении памятью. Перевод статьи подготовлен в рамках запуска специализации Python Developer. На странице вы можете узнать подробнее о специализации, а также зарегистрироваться на бесплатные мероприятия.  Редактор