Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Поток ввода/вывода: почему нет ошибки при работе с файлами без явного их закрытия

#python #language_lawyer


Пробую такие конструкции:

file = open('file.txt').read()
open('copy_file.txt', 'w').write(file)


Почему-то все работает... Из опыта работы с другими языками я ожидал увидеть некоторые
странности в связи с открытыми потоками (я их не закрываю), но все отлично работает.
Даже при многократном запуске. И не похоже, что есть проблема утечки памяти. Почему
так ? В документации ничего не нашел на эту тему...
    


Ответы

Ответ 1



У вас память используется только для хранения содержимого file.txt в переменной file. А открытые потоки закрываются и собираются сборщиком мусора сразу как заканчивается чтение или запись, так как у вас нет ссылок на эти объекты. Про сборку можно почитать по этой ссылке: http://arctrix.com/nas/python/gc/

Ответ 2



В реализации python - PyPy сборщик не закрывает файлы и поэтому может быть утечка. Поэтому конечно лучше использовать универсальный with. Это очень поможет если вы вдруг захотели перенести проект на PyPy так как он в большинстве случаев быстрее стандартной реализации python - CPython. Перенести в данном случае - просто запускать на PyPy. А также при попытке прочитать незакрытый в PyPy файл вы получите пустую строку. (если файл открыт и для записи)

Комментариев нет:

Отправить комментарий