Если бы я делал это в очень длительном процессе, где потреблялось много данных, продолжал бы этот «список» просто потреблять мою память, пока меня не отпустили?
Абсолютно.
Когда сборщик мусора заберет память обратно?После того как область, в которую встроен этот список, потеряна?
CPython использует подсчет ссылок, так что это наиболее вероятный случай.Другие реализации работают по-другому, поэтому не рассчитывайте на это.
Спасибо Карлу за то, что он указал, что из-за сложных механизмов управления памятью, используемых CPython, это не означает, что памятьсразу после этого вернулся в ОС.
Я не знаю, как работает сборщик мусора python, но я бы рискнул сказать, что этот список будет существовать до тех пор, пока не будет вызван последний следующий вызов для all_stuff.
Я не думаю, что любой сборщик мусора работает так.Обычно они помечают и убирают, поэтому может пройти довольно много времени, прежде чем список будет подвергнут сборке мусора.
Это распространенный шаблон, встречающийся в инструкциях по компиляции списка.
Абсолютно нет.Дело в том, что вы повторяете список с целью что-то сделать с каждым элементом (do
вызывается, потому что это побочные эффекты ).Во всех примерах List-comp HOWTO список повторяется, чтобы создать новый список на основе элементов старого.Давайте рассмотрим пример:
# list comp, creates the list [0,1,2,3,4,5,6,7,8,9]
[i for i in range(10)]
# loop, does nothing
for i in range(10):
i # meh, just an expression which doesn't have an effect
Возможно, вы согласитесь, что этот цикл совершенно бессмысленный, поскольку он ничего не делает, в отличие от понимания, которое составляет список.В вашем примере все наоборот: понимание совершенно бессмысленно, потому что список вам не нужен!Вы можете найти больше информации о проблеме по вопросу
Кстати, если вы действительно хотите записать этот цикл в одну строку, используйте потребитель генератора, такой как deque.extend
.В этом простом примере это будет немного медленнее, чем простой цикл for
:
>>> from collections import deque
>>> consume = deque(maxlen=0).extend
>>> consume(do(stuff) for stuff in all_stuff)