В Python новые области (или пространства имен) только создаются для модулей, классов и функций, но не для каких-либо других операторов, особенно не для блоков with
и if
. Следовательно, идентификаторы, ограниченные в теле операторов with
или for
, связаны в самой внутренней окружающей области, которая является областью верхнего уровня интерактивного интерпретатора в вашем случае. Идентификаторы связаны в области действия до тех пор, пока эта область действительна или пока они не будут явно удалены из области (используя del
, как в del fal
).
Объекты могут быть очищены только тогда, когда на них больше нет ссылок. Фактический момент, в который этот объект действительно очищен, однако не определен. Python использует сборщик мусора для управления памятью и не применяет конкретную стратегию. В CPython, который использует подсчет ссылок, объекты немедленно очищаются, как только последняя ссылка выходит из области видимости. Альтернативные реализации, такие как PyPy или Jython, используют более продвинутые сборщики мусора, которые очищают объекты без ссылок в произвольные моменты времени.
Это означает, что в вашем примере объекты, связанные с f
и fal
, по сути, никогда не очищаются, потому что область действия интерактивного интерпретатора верхнего уровня, естественно, существует, пока работает интерпретатор. Однако помните, что это на самом деле не проблема, потому что они, тем не менее, правильно закрыты и больше не требуют никаких файловых ресурсов, а только некоторой памяти.