Python управление памятью, генераторы и дель - PullRequest
0 голосов
/ 13 апреля 2020

Я экспериментировал со списками и генераторами следующим образом:

lst = list('12345')

def get_generator(lst):
    yield from lst

gen_on_lst = get_generator(lst)
lst.append('6') # you can try remove as well
print(list(gen_on_lst))

Вывод ['1', '2', '3', '4', '5', '6'], что я и ожидал, потому что вам нужно использовать генератор с al oop или чем-то подобным для это должно быть фактически выполнено, и, очевидно, генератор «связан» со списком здесь, и изменения в списке влияют на генератор.

Тогда я попробовал это:

lst = list('12345')

def get_generator(lst):
    yield from lst

gen_on_lst = get_generator(lst)
del lst
print(list(gen_on_lst))

Вывод ['1', '2', '3', '4', '5'] где я ожидал ошибку.

Так что же на самом деле происходит, когда я использую del? Я предполагаю, что генератор создает псевдоним (вероятно, недоступный для мира?), И когда я использую del, он удаляет только один псевдоним фактического списка в памяти, и память не освобождается, потому что есть псевдоним (в генератор), указывающий на это. Предполагая, что генератор удалит свой внутренний псевдоним, память будет освобождена при использовании генератора, верно?

ИЛИ, хотя и менее вероятно, что это просто вопрос времени, когда список будет удален из памяти и просто глупая удача, что я поглотил генератор до освобождения основного списка.

1 Ответ

0 голосов
/ 13 апреля 2020

То, что вы называете псевдонимом, в терминах Python называется «ссылкой». Каждый объект в Python имеет счетчик ссылок *. del уменьшает количество ссылок этого объекта на единицу.

Когда счетчик ссылок объекта достигает 0, он может быть собран мусором.

Это связано с природой переменных в Python. «Переменная» - это не что иное, как метка (или ссылка на) объекта.

Когда вы делаете

a = 'foo'

, счетчик ссылок для строкового объекта 'foo' увеличивается на 1.

Для получения дополнительной информации см. Глава 3 Python Справочник по языку .

(* обратите внимание, что я ухожу некоторые детали здесь специально.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...