Когда происходит сбор мусора?

>>>a=6
>>>b=5
>>>c=4
>>>d=c
>>>print(d)
>>>del b
>>># a and b "must be" garbage collection or "maybe" garbage collection

a и b может быть сбор мусора или a и b должен быть сбор мусора? Как это доказать?

3
nl ja de
Я честно не могу сказать, что вы просите. Не могли бы вы добавить какой-то контекст к своему вопросу и сделать вопрос более ясным? Предпочтительно использовать предложения full , с глаголами e.t.c.?
добавлено автор thkala, источник
что вы хотите спросить?
добавлено автор Usman, источник

3 ответы

CPython использует подсчет ссылок . Jython и IronPython используют свой базовый ГМ VM. Сказав, что CPython ставит мелкие целые числа, в том числе те, которые используются в вашем коде, и поэтому они специально не будут GCed.

3
добавлено

Переменные Python - это просто имена, относящиеся к объектам. В вашем примере у вас есть три объекта, целые числа 4, 5 и 6.

Целое число 6 ссылается на a, 5 изначально ссылается на b, а на 4 ссылается как c, так и d. Затем вы вызываете del (b) . Это удаляет ссылку из целого числа 5. Таким образом, в этот момент 6 и 4 все еще ссылаются, а 5 - нет.

Точно , как обработка мусора обрабатывается, является детальностью реализации.

Теперь посмотрите здесь :

Текущая реализация сохраняет массив целых объектов для всех целых чисел от -5 до 256, когда вы создаете int в этом диапазоне, вы фактически просто возвращаете ссылку на существующий объект

Таким образом, цифры, которые вы использовали в этом примере, никогда не будут собраны в мусор.

Что касается сбора мусора, описано в документации gc. set_threshold (порог 0, порог1, порог2) :

Чтобы решить, когда запускать, коллекционер отслеживает распределения и деблокировки номеров объектов с момента последнего сбора. Когда количество распределений минус количество деаллокаций превышает пороговое значение 0, начинается сбор. Первоначально рассматривается только поколение 0. Если генерация 0 была исследована более чем пороговое значение1 раз с момента обнаружения первого поколения, то также исследуется генерация 1. Аналогично, пороговое значение 2 контролирует количество коллекций поколения 1 до сбора генерации 2.

Стандартными значениями пороговых значений являются:

In [2]: gc.get_threshold()
Out[2]: (700, 10, 10)
3
добавлено

Способ сбора мусора - это деталь реализации. См. Также вопрос " Мой класс определяет __ del __ , но он не вызывается, когда я удаляю объект " в FAQ Python.

В CPython подсчет ссылок по умолчанию означает, что объекты будут удалены в момент удаления последней ссылки. Поэтому, если у вас есть объект с именем a , который упоминается только в текущей области, del a полностью удалит его.

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

В других реализациях Python может существовать полный сборщик мусора для объектов all , поэтому вы никогда не должны полагаться на del a , фактически удаляя объект. Именно поэтому вы всегда должны закрывать дескрипторы файлов вручную, используя .close() , чтобы предотвратить утечку ресурсов до тех пор, пока программа не отключится.

2
добавлено
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community